- 积性函数:是指对于所有互质的整数a和b有性质f(ab) = f(a) * f(b)
- 算术基本定理:任何一个大于1的正整数都能唯一分解为有限个质数的乘积,即N = p1^x1 * p2^x2 * p3^x3 * .... * pn^xn
POJ 1452:
题意:求2004^x的所有因子和,
输入x
输出:结果
题解:
/*****************解法*****************/
/*
* 设S(x)表示x的因数和
* 积性函数:是指对于所有互质的整数a和b有性质f(ab) = f(a) * f(b)
* 算术基本定理:任何一个大于1的正整数都能唯一分解为有限个质数的乘积,即N = p1^x1 * p2^x2 * p3^x3 * .... * pn^xn
2004 = 2^2 * 3 * 167
2004^x = 2^2x * 3^x * 167^x
* 证明:S(N) = S(p1^x1) * S(p2^x2) * S(p3^x3) * ..... * S(pn^xn)
* 首先举个例子 N = ab,S(ab) = S(a) * S(b) 且a和b都为质数
* 如果单纯来看N这个数字的因子有:1, a, b, ab
* 则 S(N) = 1 + a + b + ab;
* S(a) = 1+a, S(b) = 1+b;
* 所以 S(ab) = S(a) * S(b) 成立,则满足积性函数
* 对于其中一项,如p^x的所有因数和不就是自生p不断组合的和吗,而p的组合有:
p, p^2, p^3, p^4, ........
则:p^x的因数和 = 1 + p + p^2 + p^3 + p^4 + ..... + p^x
很明显该式为等比数列,即(p^(x+1) - 1) / (p - 1)
**下面开始解法:
* 设S(x)表示x的因数和,inverse(x)表示x的逆元
* S(2004^x) = S(2 ^ 2x) * S(3 ^ x) * S(167 ^ x)
* S(2 ^ 2x) = (2^(2x+1) - 1)
* S(3 ^ x) = (3^(x+1) - 1) / 2
* S(167^x) = (167^(x+1) - 1) / 166
* S(2004^x) = (2^(2x+1) - 1) + (3^(x+1) - 1) / 2 + (167^(x+1) - 1) / 166 有一项不是质数不能求逆元
* 因为29对S取模,所以S(167 ^ x) % 29 = S(22^x)
* 则 S(2004 ^ x) = (2^(2x+1)%mod - 1) + (3^(x+1)%mod - 1) * inverse(2) + (22^(x+1)-1) * inverse(21)
*/
/*****************解法*****************/
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
const int mod = 29;
int quick_mod(int a, int b){
LL ans = 1;
a %= mod;
while(b){
if(b & 1){
ans = ans *a % mod;
b--;
}
b >>= 1; a = a * a % mod;
}
return ans;
}
int inverse(int a){
int ans = 1;
int b = mod-2;
a %= mod;
while(b){
if(b & 1){
ans = ans * a % mod;
b--;
}
b >>= 1; a = a * a % mod;
}
return ans;
}
int main()
{
int n;
while(scanf("%d", &n) && n){
int ans = 1;
ans *= quick_mod(2, 2*n+1) - 1; ans %= mod;
ans *= (quick_mod(3, n+1) - 1) * inverse(2); ans %= mod;
ans *= (quick_mod(22, n+1) - 1) * inverse(21); ans %= mod;
ans %= mod;
printf("%d\n", ans);
}
return 0;
}