参考博客:
https://blog.csdn.net/liangzhaoyang1/article/details/72639208
题目链接:
https://codeforces.com/gym/101873/problem/B
题意:
给出$C$种颜色,涂在每面墙大小为$n\cdot n$的正$m$角楼上,求本质不同的染色方法种数
数据范围:
$1\leq n\leq 500$
$3\leq m\leq 500$
$1\leq c\leq 500$
分析:
题目可以转化为$C^{n\cdot n}$种颜色,涂在有$m$个节点的项链上,求本质不同的染色方法种数
这样我们可以直接套用Polya模板
$$ans=\frac{1}{m}\cdot \left ( C^{gcd(1,m)} +C^{gcd(2,m)}+C^{gcd(3,m)}...+C^{gcd(m,m)}\right )$$
ac代码:
#include <bits/stdc++.h>
#define ll long long
using namespace std;
const int maxn = 1e3+10;
const int mod=1e9+7;
ll qpow(ll n,ll m)
{
ll res=1;
ll k=n;
while(m)
{
if(m&1)res=res*k%mod;
k=k*k%mod;
m/=2;
}
return res;
}
int main()
{
// cout<<qpow(4,5)<<" "<<qpow(5,4)<<endl;
ll n,m,c,ans=0;
cin>>n>>m>>c;
ll g=qpow(c,n*n);
for(ll i=1;i<=m;i++)
ans=(ans+qpow(g,__gcd(i,m)))%mod;
ans=ans*qpow(m,mod-2)%mod;
cout<<ans<<endl;
return 0;
}