。。。wa了好多次! 靠 原来是因为res+=p%mod 是错的 必须写成 res=(res+p)%mod!!!!!郁闷啊!!!!!!
题意: n中颜色,m个珠子连成一个戒指,给珠子涂色,一共几种不同情况的戒指?
一共2种置换
1 旋转(m种,旋转0~m-1) 不动点数为 n^gcd(i,m)
2 翻转 分2种情况,
m为奇数, 不动点数为 m*n^((m+1)/2), m-1/2个 2阶循环,1个1阶循环
m为偶数,分2情况 a 以两点 为轴,m/2 个轴 ,不动点为 m/2*n^(m/2)
b 以两点间为轴,m/2个轴 ,不动点数为 m/2*n^(m/2+1)
#include<iostream>
#include<cstdio>
#include<math.h>
using namespace std;
typedef __int64 LL;
#define mod 1000000007
LL gcd(LL a,LL b)
{
return b==0?a:gcd(b,a%b);
}
LL pow1(LL a,LL n)
{
LL r=1,p=a;
while(n)
{
if(n&1) r=(r*p)%mod;
p=(p*p)%mod;
n>>=1;
}
return r;
}
LL x,y,d;
void exgcd(LL a,LL b)
{
if(b==0)
{
x=1;
y=0;
d=a;
}
else
{
exgcd(b,a%b);
LL t=x;
x=y;
y=t-a/b*x;
}
}
int main()
{
int t,i,j,T,n,m;
scanf("%d",&T);
LL res;
for(t=1;t<=T;t++)
{
res=0;
scanf("%d%d",&n,&m);
for(i=1;i<=m;i++)
res=(res+pow1(n,gcd(m,i)))%mod;
if(m&1)
res=(res+m*pow1(n,(m+1)/2)%mod)%mod;
else
{
res=(res+m/2*pow1(n,m/2+1)%mod)%mod;
res=(res+m/2*pow1(n,m/2)%mod)%mod;
}
exgcd(2*m,mod);
x=(x%mod+mod)%mod;
res=(res*x)%mod;
printf("Case #%d: %I64d\n",t,res);
}
return 0;
}