Consider a positive integer X,and let S be the sum of all positive integer divisors of 2004^X. 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 2004^1 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
这道题是Beijing 2008这道题的基础版,这道题直接套用因数和公式即可
2004=22⋅3⋅167 2004 = 2 2 ⋅ 3 ⋅ 167
2004x=22x⋅3x⋅167x 2004 x = 2 2 x ⋅ 3 x ⋅ 167 x
f(2004x)=22x+1−11⋅3x+1−12⋅167x+1−1166 f ( 2004 x ) = 2 2 x + 1 − 1 1 ⋅ 3 x + 1 − 1 2 ⋅ 167 x + 1 − 1 166
因为取模29,29是素数,并且并且和2,166互质,因此均可求逆元
code:
#include
using namespace std;
typedef long long ll;
const int mod = 29;
const int maxn = 1e5+10;
int p[] = {2,3,167};
int a[] = {2,1,1};
int q_pow(int a,int b){
int ans = 1;
while(b){
if(b & 1)
ans = ans * a % mod;
b >>= 1;
a = a * a % mod;
}
return ans % mod;
}
int inv(int n){
return q_pow(n,mod-2) % mod;
}
int main(){
int x;
while(~scanf("%d",&x) && x){
int ans = 1;
ans = (((q_pow(2,2*x+1) - 1) * ((q_pow(3,x+1) - 1) * inv(2) % mod)) % mod) * ((q_pow(167,x+1) - 1) * inv(166) % mod) % mod;
printf("%d\n",ans);
}
return 0;
}