LightOJ 1336 - Sigma Function(算术基本定理)

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)=p21p1e1+11p21p2e2+11......pk1pkek+11(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 p1pe+11=1+p1+p2+......+pe(2)
其次我们可以知道除了 2 2 2其它质数都是奇数,因此

  1. p p p为奇数时, p e p^e pe一定为奇数,如果要使 ( 2 ) (2) (2)为奇数,那么 e e e必为偶数。
  2. 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=p1e1p2e2p3e3......pkek
因此我们可以知道如果是情况一的话, e i e_i ei为偶数, n n n此时必定为完全平方数 X X X;如果是情况二,此时 n = 2 e ⋅ X n = 2^e \cdot X n=2eX,如果 e e e为偶数,那么 n n n就还是完全平方数,否则 n = 2 ⋅ X n = 2\cdot X n=2X

最后显然我们可以发现 σ ( X ) \sigma(X) σ(X)为奇数。

因此我们只需减去 n n n以内为 X X X 2 ⋅ X 2\cdot X 2X的情况即可。

代码

#include

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;
}

你可能感兴趣的:(算法,数论,LightOJ)