题目描述
链接:https://ac.nowcoder.com/acm/contest/21763/1020
来源:牛客网
n个人排成一个环形,每个人要从c种颜色中选择一个。
牛牛希望相邻的人选择的颜色是不同的
问有多少种方案。
输出方案数对10007取模的结果。
人是有顺序的,环旋转同构算不同的方案。
题意
环形染色问题
思路
利用递推公式证明环形染色公式
code
#include<bits/stdc++.h>
using namespace std;
typedef pair<int,int> PII;
typedef long long ll;
const int mod=10007;
int qpow(int e,int n)
{
int ret=1;
while(n)
{
if(n&1)ret=1ll*ret*e%mod;
e=1ll*e*e%mod;
n>>=1;
}
return ret;
}
void solv()
{
int n,c,ans;
cin>>n>>c;
ans=(qpow(c-1,n)+qpow(-1,n)*(c-1))%mod;
cout<<ans<<'\n';
}
int main()
{
ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
int T=1;
// cin>>T;
while(T--)
{
solv();
}
return 0;
}
总结
假设不考虑第一个与最后一个颜色需要不同
->将首位颜色相同的情况视为首位是一个涂色块
->得到an+an-1的公式
->递推的出结果
知识补充
环形图染色