LuoguP11900 不知道 题解
题目大意
给定一个长度为
初始时有
然后进行
对于每个
题目解法
经典地倒过来设,设
这样就可以做到
分母上的数是固定的,可以最后再除。然后不妨设
然后感觉这个转移式就很有规律,手模/打表一下就可以发现
归纳证明也是容易的。
然后就可以容易的做到
主要代码如下:
int n, k, a[N], num[N], tmp[N];
ll comb = 1, f[N], pre[N], suf[N];
signed main()
{
SetIO();
cin >> n >> k;
a[0] = 1;
tmp[1] = 1;
for (int i = 1; i <= k; i++)
cin >> a[i], tmp[a[i]] = 1;
for (int i = 1, j = 0; i <= n; i++)
{
num[i] = num[i - 1];
while(j <= k && a[j] < i)
{
num[i]++;
j++;
}
tmp[i] += num[i];
}
for (int i = 2; i <= n; i++)
comb = comb * Pow(tmp[i]) % MOD;
pre[1] = 1;
for (int i = 2; i <= n; i++)
pre[i] = pre[i - 1] * num[i] % MOD;
suf[n + 1] = 1;
for (int i = n; i >= 1; i--)
suf[i] = suf[i + 1] * (tmp[i] - tmp[1]) % MOD;
for (int i = 1; i <= n; i++)
cout << pre[i] * suf[i + 1] % MOD * comb % MOD << ' ';
return 0;
}