zoukankan      html  css  js  c++  java
  • AT2070[ARC061D]3人でカードゲーム/Card Game for Three【计数,组合数学】

    正题

    题目链接:https://www.luogu.com.cn/problem/AT2070


    题目大意

    有三堆卡牌各有\(n,m,k\)张,每张上写了\(a/b/c\),对于第\(1/2/3\)堆卡牌。然后开始从第一堆拿牌,然后根据拿到的牌在对应的堆拿牌。

    如果到一堆拿牌时没有牌就结束,求第一张牌结束的方案数。

    \(1\leq n,m,k\leq 3\times 10^5\)


    解题思路

    显然牌的序列我们不是很好处理因为不是顺序拿的,我们可以操作每次取的堆的编号序列。

    显然它的长度不是固定的,我们枚举其长度\(n+i\)(也就是除了\(n\)\(1\)以外有\(i\)个其他的)。

    然后答案就是

    \[\sum_{i=0}^{m+k}3^{m+k-i}\binom{n+i-1}{i}\sum_{i-k\leq j\leq m}\binom{i}{j} \]

    后面那个很难处理但是注意到区间的范围是每次向前移动,而且上面那个值是每次加一,暴力拆开

    \[\sum_{i-k\leq j\leq m}\binom{i}{j}=\sum_{i-k\leq j\leq m}\binom{i-1}{j-1}+\binom{i-1}{j} \]

    \[\Rightarrow 2\sum_{i-1-k\leq j\leq m}\binom{i-1}{j}-\binom{i-1}{i-1-k}-\binom{i-1}{m} \]

    然后就可以\(O(n)\)递推了。

    时间复杂度:\(O(n+m+k)\)


    code

    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    #define ll long long
    using namespace std;
    const ll N=1e6+10,P=1e9+7;
    ll n,m,k,ans,fac[N],inv[N],s[N],pw[N];
    ll C(ll n,ll m)
    {return fac[n]*inv[m]%P*inv[n-m]%P;}
    signed main()
    {
    	fac[0]=inv[0]=inv[1]=pw[0]=1;
    	for(ll i=1;i<N;i++)pw[i]=pw[i-1]*3ll%P;
    	for(ll i=2;i<N;i++)inv[i]=P-inv[P%i]*(P/i)%P;
    	for(ll i=1;i<N;i++)fac[i]=fac[i-1]*i%P,inv[i]=inv[i-1]*inv[i]%P;
    	scanf("%lld%lld%lld",&n,&m,&k);s[0]=1;ans=pw[m+k];
    	for(ll i=1;i<=m+k;i++){
    		s[i]=2*s[i-1]%P;
    		if(i>m)(s[i]+=P-C(i-1,m))%=P;
    		if(i>k)(s[i]+=P-C(i-1,i-k-1))%=P;
    		(ans+=C(n+i-1,i)*s[i]%P*pw[m+k-i])%=P;
    	}
    	printf("%lld\n",ans);
    	return 0;
    }
    
  • 相关阅读:
    POJ 3164 Command Network 最小树形图 朱刘算法
    区间dp专题
    HDU2896病毒入侵AC_自动机
    HDU2222Keywords Search AC_自动机
    Linux cat命令参数及使用方法详解
    MySQL分支Percona, cmake编译安装
    PHP网站简单架构 – 单独跑php-fpm
    Tengine – Nginx衍生版
    jemalloc优化MySQL、Nginx内存管理
    TCMalloc优化MySQL、Nginx、Redis内存管理
  • 原文地址:https://www.cnblogs.com/QuantAsk/p/15528943.html
Copyright © 2011-2022 走看看