Sigma Function
题解:首先,分析题目公式(1)σ(n)=p1e1+1−1p2−1⋅p2e2+1−1p2−1⋅......⋅pkek+1−1pk−1\sigma(n) = \frac{p_1^{e_1+1}-1}{p_2-1}\cdot \frac{p_2^{e_2+1}-1}{p_2-1}\cdot......\cdot\frac{p_k^{e_k+1}-1}{p_k-1} \tag1σ(n)=p2−1p1e1+1−1⋅p2−1p2e2+1−1⋅......⋅pk−1pkek+1−1(1)
我们发现可以先求为奇数的个数,再用nnn减去即可。
由等比数列的知识可知:
(2)pe+1−1p−1=1+p1+p2+......+pe\frac{p^{e+1}-1}{p-1}=1+p^1+p^2+......+p^e\tag 2p−1pe+1−1=1+p1+p2+......+pe(2)
其次我们可以知道除了222其它质数都是奇数,因此
- ppp为奇数时,pep^epe一定为奇数,如果要使(2)(2)(2)为奇数,那么eee必为偶数。
- ppp为偶数,即2e2^e2e,此时(2)(2)(2)必为奇数。
再由算术基本定理n=p1e1⋅p2e2⋅p3e3......pkekn = p_1^{e_1} \cdot p_2^{e_2} \cdot p_3^{e_3}......p_k^{e_k}n=p1e1⋅p2e2⋅p3e3......pkek
因此我们可以知道如果是情况一的话,eie_iei为偶数,nnn此时必定为完全平方数XXX;如果是情况二,此时n=2e⋅Xn = 2^e \cdot Xn=2e⋅X,如果eee为偶数,那么nnn就还是完全平方数,否则n=2⋅Xn = 2\cdot Xn=2⋅X。
最后显然我们可以发现σ(X)\sigma(X)σ(X)为奇数。
因此我们只需减去nnn以内为XXX和2⋅X2\cdot X2⋅X的情况即可。
代码
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
int main()
{
#ifndef ONLINE_JUDGE
freopen("input.in","r",stdin);
#endif
int T, t = 1;
cin >> T;
while(T--) {
LL n;
cin >> n;
cout << "Case " << t++ << ": " << n - (LL)sqrt(n) - (LL)sqrt(n / 2.0) << endl;
}
return 0;
}