Online Judge | Problem Set | Authors | Online Contests | User | ||||||
---|---|---|---|---|---|---|---|---|---|---|
Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest |
double 与 __int64 的差别是什么? //////////////////////////AC的/////////////////////////////// #include <iostream> #include <stdio.h> #include <algorithm> using namespace std; double pow(int aa, int n) { int i; double mul=1; for(i=1;i<=n;++i)mul*=(aa); return (mul); } /*////////////////////////////////////////////////////// 正n边形用k种颜色着色(考虑为一个圆的情形)本质不同着色数L==(总置换下不变着色数)/(总置换个数) //////////////////////////////////////////////////////*/ int euler (int n)//n==1,return 1;else return gcd(n,i)==1(1<=i<n)的元素个数 { int i,res; res=n; for(i=2;i*i<=n;i++) { if(n%i!=0)continue; res=res*(i-1)/i; while(n%i==0) n/=i; } if(n!=1)res=res*(n-1)/n; return res; } __int64 polyaeddy(int n,int k)//G为置换数 {//返回旋转置换下不变着色数,旋转0-->(n-1)格 int i,len; __int64 sum=0;//k==3,n<=39 for(len=1;len*len<=n;++len)//枚举循环节长度,一个置换的(循环节个数)*(每个循环节长度)==n { if(n%len!=0)continue; else i=n/len;//i为此循环节长度下,循环节个数 if(len!=i) { sum+=__int64(euler(len))*pow( k , i)+__int64(euler(i))*pow( k , len); //euler(len)为拥有此循环节长度的置换个数 } else sum+=__int64(euler(len))*pow( k , i); } return sum; } __int64 polyaoverturn(int n, int k)//G为置换数 {//返回翻转置换下不变着色数 __int64 sum=0; if(n%2==0) { sum+=pow( k, n/2+1)/__int64(2)*__int64(n); sum+=pow( k, n/2 )/__int64(2)*__int64(n); } else sum=pow( k, n/2+1)*__int64(n); return sum; } /////////////////////////////////////////////////////////////////////// int main() { int n,k; __int64 ans,sum; while(cin>>k>>n&&n) { sum=polyaoverturn(n,k); sum+=polyaeddy(n,k); ans=sum/2/n; printf("%I64d\n",ans); } return 0; } /////////////////////////////////////////////////////////////////// 下面pow函数因为把double改为__int64而WA #include <iostream> #include <stdio.h> #include <algorithm> using namespace std; __int64 pow(int aa, int n) { int i; __int64 mul=1; for(i=1;i<=n;++i)mul*=__int64(aa); return __int64(mul); } /*////////////////////////////////////////////////////// 正n边形用k种颜色着色(考虑为一个圆的情形)本质不同着色数L==(总置换下不变着色数)/(总置换个数) //////////////////////////////////////////////////////*/ int euler (int n)//n==1,return 1;else return gcd(n,i)==1(1<=i<n)的元素个数 { int i,res; res=n; for(i=2;i*i<=n;i++) { if(n%i!=0)continue; res=res*(i-1)/i; while(n%i==0) n/=i; } if(n!=1)res=res*(n-1)/n; return res; } __int64 polyaeddy(int n,int k)//G为置换数 {//返回旋转置换下不变着色数,旋转0-->(n-1)格 int i,len; __int64 sum=0;//k==3,n<=39 for(len=1;len*len<=n;++len)//枚举循环节长度,一个置换的(循环节个数)*(每个循环节长度)==n { if(n%len!=0)continue; else i=n/len;//i为此循环节长度下,循环节个数 if(len!=i) { sum+=__int64(euler(len))*pow( k , i)+__int64(euler(i))*pow( k , len); //euler(len)为拥有此循环节长度的置换个数 } else sum+=__int64(euler(len))*pow( k , i); } return sum; } __int64 polyaoverturn(int n, int k)//G为置换数 {//返回翻转置换下不变着色数 __int64 sum=0; if(n%2==0) { sum+=pow( k, n/2+1)/__int64(2)*__int64(n); sum+=pow( k, n/2 )/__int64(2)*__int64(n); } else sum=pow( k, n/2+1)*__int64(n); return sum; } /////////////////////////////////////////////////////////////////////// int main() { int n,k; __int64 ans,sum; while(cin>>k>>n&&n) { sum=polyaoverturn(n,k); sum+=polyaeddy(n,k); ans=sum/2/n; printf("%I64d\n",ans); } return 0; } Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator