【2018牛客多校Round 6 C】Generation I

题意

给定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\n",++ca,ans);
    }
}

posted @ 2018-08-06 00:55  Greenty  阅读(155)  评论(0编辑  收藏  举报