题目大意:
有一个图形有 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=fi−1×(m−2)+fi−2×(m−1)
然后推了一推
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=(m−1)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×(m−2)+fn−1×(m−1)
所以原式
=
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×(m−2)+fn−1×(m−1)
合并同类项:原式
=
f
n
×
(
m
−
1
)
+
f
n
−
1
×
(
m
−
1
)
=f_n\times (m-1) + f_{n-1}\times (m-1)
=fn×(m−1)+fn−1×(m−1)
接着再把
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=fn−1×(m−2)+fn−2×(m−1)带入
原式
=
[
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)
=[fn−1×(m−2)+fn−2×(m−1)]×(m−1)+fn−1×(m−1)
化简得
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)
fn−1×(m−2)(m−1)+fn−2×(m−1)2+fn−1×(m−1)
合并同类项:原式
=
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
=fn−1×(m−1)2+fn−2×(m−1)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(m−1)n+f0(m−1)n=(m−1)nm
∴
f
n
+
f
n
+
1
=
(
m
−
1
)
n
m
∴f_n+f_{n+1}=(m-1)^nm
∴fn+fn+1=(m−1)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+fn−1)+(fn−1+fn−2)−(fn−2+fn−3)+...±(f1+f0)
∵
f
n
+
f
n
+
1
=
(
m
−
1
)
n
m
∵f_n+f_{n+1}=(m-1)^nm
∵fn+fn+1=(m−1)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
(m−1)nm−(m−1)n−1m+(m−1)n−2m−(m−1)n−3+...±m
我们发现这是一个等比数列,公比为
−
(
m
−
1
)
=
1
−
m
-(m-1)=1-m
−(m−1)=1−m,
但是我们不确定最后的符号
所以我们要判断
n
n
n的奇偶性
当
n
n
n为偶数时最后的符号为
"
−
"
"-"
"−"
否则为
"
+
"
"+"
"+"
然后我们暂且不考虑最后一项
±
m
\pm m
±m
也就是说我们共有
n
−
1
n-1
n−1项
然后我们用等比数列求和公式(
3
≤
m
≤
50
3\leq m\leq 50
3≤m≤50所以
1
−
m
1-m
1−m即公比不可能是一所以我们只需要考虑公比不为1的情况):
设
Q
=
1
−
m
Q=1-m
Q=1−m(公比)
S
n
=
f
1
×
(
1
−
Q
n
−
1
)
1
−
Q
S_n = \frac{f_1\times (1 - Q^{n-1})}{1-Q}
Sn=1−Qf1×(1−Qn−1)
我们试着带入化简:
∵
f
1
=
m
,
Q
=
1
−
Q
∵f_1 = m, Q=1-Q
∵f1=m,Q=1−Q
∴
∴
∴原式
=
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−(1−m)m×(1−Qn−1)=mm×(1−Qn−1)=1−Qn−1
再判断一下
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);
}