| ||||||||||
| 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