原题: https://cn.vjudge.net/problem/Gym-101873B
题意:
简化后为:正m面形,每面涂色,c种颜色,置换为旋转,求方案数
解析:
所有置换分别为:静置,转1个360/m,……转m-1个360/m
也就是转0个面,1个面,……转m-1个面
很容易得到,旋转i个面时,置换群的循环节个数为gcd(i,m)
那么按照公式为:
#include<bits/stdc++.h>
using namespace std;
#define LL long long
const LL mod=1e9+7;
LL sw(LL a,LL b){
LL ans=1;
while(b){
if(b&1)ans=ans*a%mod;
a=a*a%mod;b>>=1;
}
return ans;
}
int main(){
LL n,m,c;
cin>>n>>m>>c;
LL ans=0;
for(LL i=0;i<m;i++){
LL num=n*n%mod;
if(i==0)num=num*m%mod;
else{
num=num*(__gcd(m,i))%mod;
}
ans=(ans+sw(c,num))%mod;
}
ans=ans*sw(m,mod-2)%mod;
printf("%lld\n",ans);
}