和poj1845异曲同工
可以看看这篇点击打开链接
#include <iostream>
#include <string.h>
#include <stdio.h>
#include <math.h>
#define mod 29
using namespace std;
typedef long long ll;
int prime[1000005];
int vis[1000005],cnt;
void init()
{
cnt = 0;
memset(vis,0,sizeof(vis));
for(int i=2; i<1000005; i++)
{
if(!vis[i])
{
prime[cnt++]=i;
for(int j=i+i; j<1000005; j+=i)
vis[j]=1;
}
}
}
ll cf(ll b,ll m,ll tt)//直接乘 会爆精度 所以用加法
{
ll ans=0;
while(m)
{
if(m&1)
ans=(ans+b)%tt;
m>>=1;
b=(b+b)%tt;
}
return ans;
}
ll quickmod(ll n,ll m,ll tt)
{
ll ans=1;
while(m)
{
if(m&1)
ans=cf(ans,n,tt)%tt;
m>>=1;
n=cf(n,n,tt)%tt;
}
return ans;
}
int main()
{ int t;
ll a,b;
init();
while(~scanf("%lld",&b))
{ if(b==0) break;
a=2004;
ll ans=1;
ll x=a;
for(int i=0; prime[i]*prime[i]<=a; i++)
{
if(a%prime[i]==0)
{
ll tmp=0;
while(x%prime[i]==0)
{
tmp++;
x/=prime[i];
}
ll mb=mod*(prime[i]-1);
ans=ans*(quickmod(prime[i],b*tmp+1,mb)-1)/(prime[i]-1);
ans%=mod;
}
}
if(x>1)
{
ll mb=mod*(x-1);
ans=ans*(quickmod(x,b+1,mb)-1)/(x-1);
ans%=mod;
}
cout<<ans<<endl;
}
return 0;
}