H - Happy 2004

版权声明:叶小小 https://blog.csdn.net/dy416524/article/details/86479338

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.

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. 

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

即求2000^X%29,2004分解为2*2*3*167=2^2*3*167,即求2^2X%29*3^X%29*167^X%29.

3^X等比求和,减一,(因为X!=0)3^X=(3^X-1)/(3-1)=(3^X-1)/2%29,取模没有除,所以用逆元:

用费马小定理求逆元:

用快速幂。求得a^p-2.即代码如下

#include <iostream>
#include <cstdio>
typedef long long ll;
using namespace std;
ll fun(ll n,ll a,ll p)
{
    ll ans=1;
    while(a)
    {
        if(a%2!=0) ans=ans*n%p;
        n=n*n%p;
        a/=2;
    }
    return ans%p;
}
int main()
{
    int n,x;
    while(~scanf("%d",&n))
    {
        if(n==0) break;
        ll a=fun(2,2*n+1,29)-1;
        ll b=(fun(3, n + 1, 29) - 1) * fun(2, 27, 29);//2的逆元
        ll c=(fun(167, n + 1, 29) - 1) * fun(166, 27, 29);//166的逆元
        printf("%lld\n",(a*b*c)%29);
    }
    return 0;
}


 

猜你喜欢

转载自blog.csdn.net/dy416524/article/details/86479338