比赛 |
2022级数学专题练习赛7 |
评测结果 |
AWWWWWWWWW |
题目名称 |
物品染色 |
最终得分 |
10 |
用户昵称 |
yrtiop |
运行时间 |
0.007 s |
代码语言 |
C++ |
内存使用 |
0.95 MiB |
提交时间 |
2023-01-30 19:46:03 |
显示代码纯文本
#include <bits/stdc++.h>
using i64 = long long;
const i64 mod = 1e9 + 7;
const int maxn = 2e5 + 5;
i64 frac[maxn],ans,inv[maxn];
int n,m,a[maxn];
i64 power(i64 x,i64 y) {
i64 ans = 1;
for(;y;y >>= 1) {
if(y & 1)
(ans *= x) %= mod;
(x *= x) %= mod;
}
return ans;
}
i64 C(int n,int m) {
if(n < m||n < 0||m < 0)return 0;
return frac[n] * inv[m] % mod * inv[n - m] % mod;
}
i64 sub(i64 x,i64 y) {
return (x - y) < 0 ? (x - y + mod) : (x - y);
}
int main() {
freopen("dye.in","r",stdin);
freopen("dye.out","w",stdout);
scanf("%d %d",&n,&m);
for(int i = 1;i <= m;++ i)
scanf("%d",&a[i]);
ans = power(m , n);
frac[0] = 1;
for(int i = 1;i <= 2 * n;++ i)
frac[i] = 1ll * frac[i - 1] * i % mod;
inv[2 * n] = power(frac[2 * n] , mod - 2);
for(int i = 2 * n - 1;~ i;-- i)
inv[i] = 1ll * inv[i + 1] * (i + 1) % mod;
for(int i = 1;i <= m;++ i) {
if(a[i] == n)continue ;
ans = sub(ans , C(n - a[i] - 1 + m - 1 , m - 1));
}
printf("%lld\n",ans);
return 0;
}