ABC 400 E(完全平方数性质,质因子)
ABC400E
关于完全平方数的一个充要条件:它的每个质因子数量必须都是偶数。证明不难,一想就懂。
那么题目要求的数显然一定是一个完全平方数。而 \(<=10^{12}\) 的完全平方数的数量只有 \(10^{6}\) 个。故可以直接检查这些数的质因子种类数是否为 \(2\) 来判断。又因为对于任意一个完全平方数 \(x\),\(\sqrt{x}\) 与 \(x\) 的质因子种类数是相同的(所有因子只是数量扩大一倍,种类没有增加),因此只需要检查 \(1到10^{6}\) 每个数的质因子种类数即可。
而检查 \(1到10^{6}\) 每个数的质因子种类数也可以用一种调和级数写法来求:
// 确定1~N每个数的质因子种类数
vector<int> cnt(N); // cnt[x]: x 的质因子种类数
for(int i = 2; i <= N; i ++){
if(cnt[i] == 0){ // i 一定是质因子,将所有以 i 为因子的数累计贡献
for(int j = i; j <= 1e6; j += i){
cnt[j] ++;
}
}
}
\(ps:\) 若要筛 \(1到N\) 每个数的所有质因子,则直接对每个数开个 \(vector\),累计贡献时顺便加入当前质因子即可。