链接
题目描述
n个格子染k种颜色,要求任意为l的格子段里不能有相同的颜色
思路
第一个格子显然k种选择
往后按l逐步递减
超出l一个之后会发现和第2个又组成了一个格子段,所以颜色还是限制
后面以此类推
所以
a
n
s
=
k
!
(
k
−
l
+
1
)
!
+
(
k
−
l
+
1
)
n
−
l
ans = \frac{k!}{(k-l+1)~!} + (k-l+1)^{n-l}
ans=(k−l+1) !k!+(k−l+1)n−l
代码
#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
#include<cmath>
#define ll long long
using namespace std;
ll T, n, k, l, ans, last;
const ll mo = 1e9+7;
int ksm(int x, int p)
{
int ans = 1;
x %= mo;
while(p)
{
if (p & 1) ans = (ll)ans * x % mo;
x = (ll)x * x % mo;
p >>= 1;
}
return ans % mo;
}
int main()
{
scanf("%d", &T);
while(T--)
{
scanf("%lld%lld%lld", &n, &k, &l);
if(k < l) printf("0\n");
else {
ans = 1;
last = k + 1 - l;
for(int i = k; i >= last; --i)
ans = (ans * i) % mo;
if(n - l < 0) {
ans = 1;
for(int i = k; i >= k - n + 1; --i)
ans = (ans * i) % mo;
printf("%lld\n", ans);
}
else {
ans = ans * ksm(last, n - l) % mo;
printf("%lld\n", ans);
}
}
}
return 0;
}