zoukankan      html  css  js  c++  java
  • 【ARC102E】Stop. Otherwise...(容斥原理,动态规划)

    【ARC102E】Stop. Otherwise...(容斥原理,动态规划)

    题面

    AtCoder
    (n)个骰子,每个骰子有(K)个面,上面有(1)(K)。骰子都是一样的。
    现在对于([2,2k])中的每一个数(x),要求出满足不存在任意两个骰子的点数和为(x)的方案数。

    题解

    显然这个东西是一个容斥计算的过程。
    而两两之间的点数和恰好为(x)的配对方案数也是有限的。
    那么枚举至少出现了(k)不合法的数字配对的情况。
    得到了:

    [Ans=sum_{i=0}^i (-1)^t{tchoose i}{n-2i+k-1choose k-1} ]

    其中(t)表示能够拼出(x)的无序点对数。

    #include<iostream>
    #include<cstdio>
    using namespace std;
    #define MOD 998244353
    #define MAX 4040
    void add(int &x,int y){x+=y;if(x>=MOD)x-=MOD;}
    int jc[MAX],jv[MAX],inv[MAX],n,k,tot[MAX];
    int C(int n,int m){return 1ll*jc[n]*jv[m]%MOD*jv[n-m]%MOD;}
    int main()
    {
    	scanf("%d%d",&k,&n);
    	jc[0]=jv[0]=inv[0]=inv[1]=1;
    	for(int i=2;i<=n+k;++i)inv[i]=1ll*inv[MOD%i]*(MOD-MOD/i)%MOD;
    	for(int i=1;i<=n+k;++i)jc[i]=1ll*jc[i-1]*i%MOD;
    	for(int i=1;i<=n+k;++i)jv[i]=1ll*jv[i-1]*inv[i]%MOD;
    	for(int i=1;i<=k;++i)tot[i+1]+=1,tot[i+k+1]-=1;
    	for(int i=1;i<=k+k;++i)tot[i]+=tot[i-1];
    	for(int i=2;i<=k+k;++i)
    	{
    		int cnt=(tot[i]+1)/2,ans=0;
    		for(int j=0,d=1;j<=cnt&&j+j<=n;++j,d=MOD-d)
    			add(ans,1ll*d*C(cnt,j)%MOD*C(n-2*j+k-1,k-1)%MOD);
    		printf("%d
    ",ans);
    	}
    	return 0;
    }
    

    然后听(ppl)说还有一种(dp)方法。
    因为每一对无序对中,都只能选择恰好一个,所以设(f[i][j])表示从(i)个无序对中恰好选择了(j)个的方案数,每个组里面至少要选择一个。
    那么转移就是(f[i][j]=2*f[i-1][j-1]+f[i][j-1])
    转移的两部分是这样子看的,前半部分是选择一个新组,可以从两个中任选一个,否则强制选择上一组,并且只能选择之前选过的那一个。
    那么得到每个组可以不选东西的方案数(displaystyle g[i][j]=sum_{k=0}^i {ichoose k}f[k][j])。即考虑选择了几个组,然后计算一下方案数。
    这样子一来询问的时候只需要询问的考虑就行了。
    (x)为奇数的时候,那么直接枚举多少个可能构成组,然后剩下的在范围外,随意组合。
    (x)为偶数的时候,特殊考虑是否选择(x/2),选了就只能选一个,然后组合数考虑。
    (g)的时候用(NTT)优化,时间复杂度(O(n^2log))
    没有代码,要代码的话,戳ppl博客

  • 相关阅读:
    DS博客作业03--树
    DS博客作业02--栈和队列
    DS博客作业02--线性表
    c博客06-结构体&文件
    c博客作业-指针
    C语言博客作业04--数组
    C语言博客作业03--函数
    图书馆
    5-互评-OO之接口-DAO模式代码阅读及应用.xls
    DS博客作业04--图
  • 原文地址:https://www.cnblogs.com/cjyyb/p/10176132.html
Copyright © 2011-2022 走看看