poj 1286 注意n=0的情况以及n大于18时数据规模会超int
#include <iostream>
using namespace std;
long long phi(long long n)
{
long long res=n;
for(long long i=2,j=4;j<=n;i++,j+=2*i-1)
{
if(!(n%i))
{
res=res/i*(i-1);
while(!(n%i))
n/=i;
}
}
if(n>1)
res=res/n*(n-1);
return res;
}
long long pow(long long a,long long n)
{
long long res=1;
while(n)
{
if(n&1)
res*=a;
a*=a;
n>>=1;
}
return res;
}
long long c,n;
int main()
{
c=3;
while(scanf("%lld",&n)!=EOF)
{
if(n==-1)
break;
if(!n)
{
puts("0");
continue;
}
long long res=0;
for(long long i=1;i<=n;i++)
{
if(n%i==0)
res+=pow(c,i)*phi(n/i);
}
if(n&1)
res+=n*pow(c,n/2+1);
else
res+=n/2*(pow(c,n/2)+pow(c,n/2+1));
printf("%lld\n",res/(2*n));
}
return 0;
}
poj 2409
hdu 3923 大数的polya#include <iostream> using namespace std; int phi(int n) { int res=n; for(int i=2,j=4;j<=n;i++,j+=2*i-1) { if(!(n%i)) { res=res/i*(i-1); while(!(n%i)) n/=i; } } if(n>1) res=res/n*(n-1); return res; } int pow(int a,int n) { int res=1; while(n) { if(n&1) res*=a; a*=a; n>>=1; } return res; } int c,n; int main() { while(scanf("%d%d",&c,&n)!=EOF) { if(!c && !n) break; int res=0; for(int i=1;i<=n;i++) { if(n%i==0) res+=pow(c,i)*phi(n/i); } if(n&1) res+=n*pow(c,n/2+1); else res+=n/2*(pow(c,n/2)+pow(c,n/2+1)); printf("%d\n",res/(2*n)); } return 0; }
#include <iostream> #include <cstring> #include <cstdio> #define mod 1000000007 using namespace std; __int64 extended_gcd(__int64 a,__int64 b,__int64 &x,__int64 &y) { __int64 ans,t; if(!b) { x=1; y=0; return a; } ans=extended_gcd(b,a%b,x,y); t=x; x=y; y=t-(a/b)*y; return ans; } __int64 div_mod(__int64 a,__int64 b) { __int64 x=0,y=0; extended_gcd(b,mod,x,y); __int64 res=a*x%mod; while(res<0) res+=mod; return res; } __int64 phi(__int64 n) { __int64 res=n; for(__int64 i=2;i<=n;i++) { if(!(n%i)) { res-=res/i; while(!(n%i)) n/=i; } } if(n>1) res-=res/n; return res; } __int64 poww(__int64 a,__int64 n) { __int64 res=1; while(n) { if(n& (__int64)1) res=res*a%mod; a=a*a%mod; n>>=1; } return res; } int main() { __int64 t,c,n,case_t=0; scanf("%I64d",&t); while(t--) { scanf("%I64d %I64d",&c,&n); __int64 res=0; for(__int64 i=1;i<=n;i++) { if(n%i==0) { res+=poww(c,i)*phi(n/i); res%=mod; } } if(n& (__int64)1) { res+=n*poww(c,n/2+1); res%=mod; } else { res+=n/2*(poww(c,n/2)+poww(c,n/2+1)); res%=mod; } printf("Case #%I64d: ",++case_t); printf("%I64d\n",div_mod(res,(2*n))); } return 0; }