1. 程式人生 > >Problem B—— Buildings(Polya計數裸題)

Problem B—— Buildings(Polya計數裸題)

題意:

簡化後為:正m面形,每面塗色,c種顏色,置換為旋轉,求方案數

解析:

所有置換分別為:靜置,轉1個360/m,……轉m-1個360/m 也就是轉0個面,1個面,……轉m-1個面

很容易得到,旋轉i個面時,置換群的迴圈節個數為gcd(i,m)

那麼按照公式為:i=0m1cgcd(i,m)m\frac{\sum_{i=0}^{m-1} c^{gcd(i,m)}}{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); }