JZ Day13 T2 n染色

题目大意:

有一个图形有 n n n条边,某位 d a l a o dalao dalao m m m支不同颜色的笔,要给 n n n条边都涂上颜色并且要求每两条相邻的边颜色不相同,求方案数


解题思路:

比赛的时候暴力打表找规律
发现当 m m m相同的时候:
f i = f i − 1 × ( m − 2 ) + f i − 2 × ( m − 1 ) f_i=f_{i-1}\times (m-2) + f_{i-2}\times (m-1) fi=fi1×(m2)+fi2×(m1)
然后推了一推 f n f_n fn f 1 , f 2 f_1,f_2 f1,f2的关系
没推出来

然后下面就是证明
首先我们在 f 1 = m , f 0 = 0 f_1=m,f_0=0 f1=m,f0=0的情况下证明 f n + f n + 1 = ( m − 1 ) n × m f_n+f_{n+1}=(m-1)^n\times m fn+fn+1=(m1)n×m
我们有: f n + 1 = f n × ( m − 2 ) + f n − 1 × ( m − 1 ) f_{n+1}=f_n\times (m-2)+f_{n-1}\times (m-1) fn+1=fn×(m2)+fn1×(m1)
所以原式 = f n + f n × ( m − 2 ) + f n − 1 × ( m − 1 ) =f_n+f_n\times (m-2)+f_{n-1}\times (m-1) =fn+fn×(m2)+fn1×(m1)
合并同类项:原式 = f n × ( m − 1 ) + f n − 1 × ( m − 1 ) =f_n\times (m-1) + f_{n-1}\times (m-1) =fn×(m1)+fn1×(m1)
接着再把 f n = f n − 1 × ( m − 2 ) + f n − 2 × ( m − 1 ) f_{n}=f_{n-1}\times (m-2)+f_{n-2}\times (m-1) fn=fn1×(m2)+fn2×(m1)带入
原式 = [ f n − 1 × ( m − 2 ) + f n − 2 × ( m − 1 ) ] × ( m − 1 ) + f n − 1 × ( m − 1 ) =[f_{n-1}\times(m-2) + f_{n-2}\times (m-1)] \times (m-1) + f_{n-1}\times (m-1) =[fn1×(m2)+fn2×(m1)]×(m1)+fn1×(m1)
化简得 f n − 1 × ( m − 2 ) ( m − 1 ) + f n − 2 × ( m − 1 ) 2 + f n − 1 × ( m − 1 ) f_{n-1}\times (m-2)(m-1) + f_{n-2}\times (m-1)^2 + f_{n-1}\times (m-1) fn1×(m2)(m1)+fn2×(m1)2+fn1×(m1)
合并同类项:原式 = f n − 1 × ( m − 1 ) 2 + f n − 2 × ( m − 1 ) 2 =f_{n-1}\times (m-1)^2 + f_{n-2}\times (m-1)^2 =fn1×(m1)2+fn2×(m1)2
……
以此类推,原式 = f 1 ( m − 1 ) n + f 0 ( m − 1 ) n = ( m − 1 ) n m =f_1(m-1)^n + f_0(m-1)^n = (m-1)^nm =f1(m1)n+f0(m1)n=(m1)nm

∴ f n + f n + 1 = ( m − 1 ) n m ∴f_n+f_{n+1}=(m-1)^nm fn+fn+1=(m1)nm
但是我们要求的是 f n f_n fn
所以我们想办法把把 f n f_n fn f n + 1 f_{n+1} fn+1消掉
我们尝试消去 f n f_n fn,让两边同时加上或减去某些数,原等式左边为:
f n + f n + 1 − ( f n + f n − 1 ) + ( f n − 1 + f n − 2 ) − ( f n − 2 + f n − 3 ) + . . . ± ( f 1 + f 0 ) f_n+f_{n+1}-(f_n+f_{n-1})+(f_{n-1}+f_{n-2})-(f_{n-2}+f_{n-3})+...\pm (f_1 + f_0) fn+fn+1(fn+fn1)+(fn1+fn2)(fn2+fn3)+...±(f1+f0)
∵ f n + f n + 1 = ( m − 1 ) n m ∵f_n+f_{n+1}=(m-1)^nm fn+fn+1=(m1)nm
∴ ∴ 等式右边为:
( m − 1 ) n m − ( m − 1 ) n − 1 m + ( m − 1 ) n − 2 m − ( m − 1 ) n − 3 + . . . ± m (m-1)^nm-(m-1)^{n-1}m+(m-1)^{n-2}m-(m-1)^{n-3}+...\pm m (m1)nm(m1)n1m+(m1)n2m(m1)n3+...±m
我们发现这是一个等比数列,公比为 − ( m − 1 ) = 1 − m -(m-1)=1-m (m1)=1m,
但是我们不确定最后的符号
所以我们要判断 n n n的奇偶性
n n n为偶数时最后的符号为 " − " "-" ""
否则为 " + " "+" "+"
然后我们暂且不考虑最后一项 ± m \pm m ±m
也就是说我们共有 n − 1 n-1 n1
然后我们用等比数列求和公式( 3 ≤ m ≤ 50 3\leq m\leq 50 3m50所以 1 − m 1-m 1m即公比不可能是一所以我们只需要考虑公比不为1的情况):
Q = 1 − m Q=1-m Q=1m(公比)
S n = f 1 × ( 1 − Q n − 1 ) 1 − Q S_n = \frac{f_1\times (1 - Q^{n-1})}{1-Q} Sn=1Qf1×(1Qn1)
我们试着带入化简:
∵ f 1 = m , Q = 1 − Q ∵f_1 = m, Q=1-Q f1=m,Q=1Q
∴ ∴ 原式 = f n = m × ( 1 − Q n − 1 ) 1 − ( 1 − m ) = m × ( 1 − Q n − 1 ) m = 1 − Q n − 1 =f_n = \frac{m\times (1 - Q^{n-1})}{1-(1-m)}=\frac{m\times (1 - Q^{n-1})}{m}=1-Q^{n-1} =fn=1(1m)m×(1Qn1)=mm×(1Qn1)=1Qn1
再判断一下 n n n的奇偶性加上最后一项就好了


A c c e p t e d   c o d e : Accepted\ code: Accepted code:

#include<cstdio>

using namespace std;

const int ymw = 1e9 + 7;

int m;
long long n;

long long ksm(long long x, long long m) {
	long long ans = 1; x %= ymw;
	while (m) {
		if (m & 1) (ans *= x) %= ymw;
		(x *= x) %= ymw;
		m >>= 1;
	}
	return ans;
}

int main() {
	//freopen("color.in", "r", stdin);
	//freopen("color.out", "w", stdout);
	scanf("%lld %d", &n, &m);
	printf("%d", (ksm(m-1, n) + (m-1) * ((n&1) ? -1 : 1)) % ymw);
}
  • 5
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值