Sigma Function
题解:首先,分析题目公式
(1)
σ
(
n
)
=
p
1
e
1
+
1
−
1
p
2
−
1
⋅
p
2
e
2
+
1
−
1
p
2
−
1
⋅
.
.
.
.
.
.
⋅
p
k
e
k
+
1
−
1
p
k
−
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)
我们发现可以先求为奇数的个数,再用
n
n
n减去即可。
由等比数列的知识可知:
(2)
p
e
+
1
−
1
p
−
1
=
1
+
p
1
+
p
2
+
.
.
.
.
.
.
+
p
e
\frac{p^{e+1}-1}{p-1}=1+p^1+p^2+......+p^e\tag 2
p−1pe+1−1=1+p1+p2+......+pe(2)
其次我们可以知道除了
2
2
2其它质数都是奇数,因此
- p p p为奇数时, p e p^e pe一定为奇数,如果要使 ( 2 ) (2) (2)为奇数,那么 e e e必为偶数。
- p p p为偶数,即 2 e 2^e 2e,此时 ( 2 ) (2) (2)必为奇数。
再由算术基本定理
n
=
p
1
e
1
⋅
p
2
e
2
⋅
p
3
e
3
.
.
.
.
.
.
p
k
e
k
n = p_1^{e_1} \cdot p_2^{e_2} \cdot p_3^{e_3}......p_k^{e_k}
n=p1e1⋅p2e2⋅p3e3......pkek
因此我们可以知道如果是情况一的话,
e
i
e_i
ei为偶数,
n
n
n此时必定为完全平方数
X
X
X;如果是情况二,此时
n
=
2
e
⋅
X
n = 2^e \cdot X
n=2e⋅X,如果
e
e
e为偶数,那么
n
n
n就还是完全平方数,否则
n
=
2
⋅
X
n = 2\cdot X
n=2⋅X。
最后显然我们可以发现 σ ( X ) \sigma(X) σ(X)为奇数。
因此我们只需减去 n n n以内为 X X X和 2 ⋅ X 2\cdot X 2⋅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;
}