加载中...

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\),累计贡献时顺便加入当前质因子即可。

code

posted @ 2025-04-16 21:37  jxs123  阅读(42)  评论(0)    收藏  举报