Problem B—— Buildings(Polya计数裸题)

原题: https://cn.vjudge.net/problem/Gym-101873B

题意:

简化后为:正m面形,每面涂色,c种颜色,置换为旋转,求方案数

解析:

所有置换分别为:静置,转1个360/m,……转m-1个360/m
也就是转0个面,1个面,……转m-1个面

很容易得到,旋转i个面时,置换群的循环节个数为gcd(i,m)

那么按照公式为: i = 0 m 1 c g c d ( 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);
}


猜你喜欢

转载自blog.csdn.net/jk_chen_acmer/article/details/82946729