P10116 [LMXOI Round 1] Random 题解(评分:7.6)
前言
不知道 Random 是不是指一首曲子。
有趣但是简单的数数题,感觉比 T2 简单。
都推式子?那我就从组合意义考虑吧!
Solution
考虑我们在统计
发现有重叠部分,但是事实上这里对答案的贡献为
如果考虑操作序列去匹配
为什么这是正确的?
因为同一个操作序列中如果多次出现
这时候我们惊喜地发现两件事:
第一、
所以我们只需要计算
第二、类似的,
所以我们压根不用输入第二行。
那么现在,修改的位置选择共
修改成的数
要求:对应的
换句话说,不管我前面的修改位置怎么选,总有
共有
修改位置
要求:
有多少种情况?我又不会了。
老规矩考虑正难则反,我统计不是每一个位置都出现过的情况。
即:我考虑有
然后用小学学过的容斥原理,
最后,答案为:
式子和其他题解有一点不同。
实现是简单的,
后记
听我劝谏:人生苦短,正难则反……
Play like you never did before!
AC code
#include<bits/stdc++.h>
#define int long long
#define mod 998244353
using namespace std;
int qp(int x,int y)
{
int ans=1;
for(int i=1,j=x;i<=y;i*=2,j=(j*j)%mod) if(y&i) ans=(ans*j)%mod;
return ans;
}
int n,m,q,k,i,j,c[3141592],ans,anf;
signed main()
{
cin>>n>>m>>q>>k;
if(q>=m)
{
ans=((n-m+1)*qp(k,q-m))%mod;
anf=qp(n,q);
c[1]=c[m-1]=m;c[0]=c[m]=1;
for(i=2;i<=(m+1)/2;i++) c[i]=c[m-i]=((c[i-1]*(m+1-i))%mod*qp(i,mod-2))%mod;
for(i=1;i<=m;i++)
{
if(i%2)
anf=(anf-qp(n-i,q)*c[i])%mod;
else
anf=(anf+qp(n-i,q)*c[i])%mod;
}
anf=(anf+mod)%mod;
ans=(ans*anf)%mod;
}
cout<<ans;
return 0;
}