Problem B—— Buildings(Polya計數裸題)
阿新 • • 發佈:2018-12-13
題意:
簡化後為:正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);
}