Happy 2004
Consider a positive integer X,and let S be the sum of all positive integer divisors of 2004X. Your job is to determine S modulo 29 (the rest of the division of S by 29).
Take X = 1 for an example. The positive integer divisors of 20041 are 1, 2, 3, 4, 6, 12, 167, 334, 501, 668, 1002 and 2004. Therefore S = 4704 and S modulo 29 is equal to 6.
Input
The input consists of several test cases. Each test case contains a line with the integer X (1 <= X <= 10000000).
A test case of X = 0 indicates the end of input, and should not be processed.
Output
For each test case, in a separate line, please output the result of S modulo 29.
Sample Input
1
10000
0
Sample Output
6
10
题目大意为给出X([1,10000000]),求2004X的所有因子之和。
思路分析:
求某个数x的因子和是先将x进行素数拆分,然后令g(p, e) = (p^(e+1)-1) / (p-1) (前n项和公式),则s(x) = g(p1, e1) * g(p2, e2) * … * g(pk, ek)
现在要求2004X的因子和,我们先将其素数拆分,得到这样一组(p,e):
(2,2X) (3,X) (167,X)
之后:
下面给出代码:
#include <iostream>
using namespace std;
int pow_mod(int a, int b, int c)
{
int ans = 1;
a = a%c;
while(b)
{
if(b&1) ans = ans*a%c;
a = a*a%c;
b >>= 1;
}
return ans;
}
//逆元用处:(a*b)/c%M = (a%M)*(b%M)*inv(c)
int inv(int x, int c) //求x模c的逆元(c为质数),运用费马小定理a*a^(p-2)%p=1,x的逆元就是x^(p-2)%p,快速幂解决。
{
return pow_mod(x, c-2, c);
}
int main()
{
int X;
// cout<<inv(1,29)<<inv(2,29)<<inv(166,29)<<endl;
while(cin>>X && X)
{
int ans = (pow_mod(2,2*X+1,29)-1)*(pow_mod(3,X+1,29)-1)*(pow_mod(167,X+1,29)-1)*9;
cout<<ans%29<<endl;
}
return 0;
}