题意
给定n个不可重复的集合,序号1~n,m种元素
执行n次操作:第i次操作,m种颜色中选出一种颜色,插入到集合i~n中
问最后的集合有多少种不同的状态
分析
考虑到,如果一个颜色重复选,那么只有第一次插入对集合效果有影响
问题转化成m种颜色里先后选k种,再选出这k种颜色所对应的集合位置
m种颜色先后选k种,方案数为A(k,m)
第一种颜色一定放在第一个位置,后面还剩n-1个位置,要放上k-1个颜色,顺序已经确定,则为C(k-1,n-1);
枚举k从1到min(n,m),根据乘法原理和加法原理,得到最后的答案
代码
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll mod = 998244353;
ll ans,n,m;
ll A,fz,fm;
ll inv[1000005];
ll ksm(ll a,ll b)
{
ll res = 1;
while(b){
if(b&1) {res*=a;res%=mod;}
a = (a*a)%mod;
b>>=1;
}
return res%mod;
}
int main()
{
int _,ca=0;scanf("%d",&_);
inv[1] = 1;
for(int i = 2;i<=1000000;i++) inv[i]=inv[mod%i]*(mod-mod/i)%mod;
while(_--)
{
scanf("%lld%lld",&n,&m);
ans = 0,A=1,fz=1,fm=1;
long long nn = n<m?n:m;
for(int k=1;k<=nn;k++)
{
A*=(m-k+1)%mod;A%=mod;
if(k-1){
fz*=((n-1)-k+2 )%mod;fz%=mod;
fm*=inv[k-1]%mod;fm%=mod;
}
ans+=((fz*fm%mod)*A%mod);
ans%=mod;
}
printf("Case #%d: %lld
",++ca,ans);
}
}