[1.30] T2-n染色

题目大意

给出一个n边形,用m种颜色给n边形的边上色,求有多少种方案能够使每两条相邻边不同色

题目解析

设有 n 个点时,方案数为 A[n]。

一个一个点考虑,加入第 n 个点时:

其左右不同,则插入之前的方案数为 A[n-1],第 n 个点可以有 m-2种选择。

其左右相同,在插入之前,则删掉其中一个点之后的的 n-2 个点是满足要求的方案,数量为 A[n-2],则 n 的颜色只需与相邻的不同,有 m-1 种方案。

综上,递推公式为 A[n] = A[n-1] * (m-2) + A[n-2] * (m-1)。
通项公式(特征根):A[n] = (m-1)n + (m-1)*(-1)n
(快速幂)

代码

#include<bits/stdc++.h>
#define L long long 
using namespace std;
L n,m,ans=1,M=1e9+7;
void qpow(L a,L b)
{
	while(b)
	{
	  if(b&1) (ans*=a)%=M;
	  (a*=a)%=M;
	  b>>=1;
	}
}
ifstream fin("color.in");
ofstream fout("color.out");
int main()
{
	fin>>n>>m;
	qpow(m-1,n);
	if(n%2==0) (ans+=m-1)%=M;
	else (ans-=m-1)%=M;
	fout<<ans;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值