zoukankan      html  css  js  c++  java
  • 【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
    ",++ca,ans);
        }
    }
    
    
  • 相关阅读:
    HBase in Action前三章笔记
    关于视频YUV
    23种设计模式用英语怎样表达?
    UVA 10620
    工具,帮助我们更高效的工作
    VS下控制台执行保持(不要一闪而过)
    C语言之结构体
    Linux grep命令和正则表达式
    C#中的“静态”
    推荐一个计算机视觉图书:python计算机视觉编程
  • 原文地址:https://www.cnblogs.com/greenty1208/p/9428072.html
Copyright © 2011-2022 走看看