比赛 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;
}