• AtCoder Regular Contest 102 (ARC102) E


    原文链接https://www.cnblogs.com/zhouzhendong/p/ARD102E.html

    题目传送门 - ARC102E

    题意

      有 $n$ 个取值为 $[1,k]$ 的骰子,对于每一个 $i(iin [2,2k])$ ,输出满足“任意两个骰子的值的和不为 $i$ ”的情况总数。

      $1leq n,kleq 2000$

    题解

      扯淡还是要先撤的。比赛的时候被 D 题续了好久, E 题差一句话就调出来了。如果赛后与 Functionendless 交流完 D 题,回来检查这题,然后检查了 2 分钟就发现了错误…… QAQ

      首先考虑求解其中一个 $i$:

      如果 $i$ 为 奇数 : 那么,显然,对于所有 $x(xleq frac{i-1}2)$  , $i-x eq x$ ,且所有骰子的取值中只可能出现 $x$ 或者 $i-x$ ,当然也有可能两种都不出现,我们称这样的一对数为一对“互斥数对”。显然知道 $i$ 和 $k$ 之后,互斥数对的种数很容易知道,设为 $lim$ 。于是我们枚举一下选择几个互斥数对,假设我们选择了 $j$ 种互斥数对:那么,首先是在所有的互斥数对里选择 $j$ 个数对,方案数为 $inom{lim}{j}$;然后,对于每一种出现的互斥数对,都可以选择其中一种数让他出现,故有 $2^j$ 种,这样子相当于已经至少选择了 $j$ 个数,故我们还要放 $n-j$ 个数字,我们有 $k-lim+j$ 种数字可供任意选择。于是问题被转化成了在 $k-lim+j$ 个带标号的位置放上非负整数,使得所有位置的数之和为 $n-j$ 的方案数。这个东西直接用 插板法 搞成组合数就可以了。

      如果 $i$ 为 偶数 :那么显然出现了一种特殊情况: $2x=i$ ,于是 $x$ 这个数最多只能出现。于是我们直接分这个数字出现和不出现两种情况,问题就被转化成了两个 $i$ 为奇数时的问题了。详见代码。

      通过预处理组合数和预处理 $2$ 的幂,我们可以在大约 $O(n^2+nk)$ 的时间复杂度内通过此题。

    代码

    #include <bits/stdc++.h>
    using namespace std;
    const int N=4005,mod=998244353;
    int n,k,C[N][N],pw2[N];
    int c(int n,int m){
    	if (m>n||m<0)
    		return 0;
    	return C[n][m];
    }
    int calc(int m,int n){return c(n+m-1,m-1);}
    int Get(int v,int n,int k){
    	int ans=0;
    	int lim=max(0,v/2-max(0,v-1-k));
    	for (int i=0;i<=lim;i++)
    		ans=(1LL*pw2[i]*C[lim][i]%mod*calc(k-lim*2+i,n-i)+ans)%mod;
    	return ans;
    }
    int main(){
    	pw2[0]=1;
    	for (int i=1;i<N;i++)
    		pw2[i]=pw2[i-1]*2%mod;
    	for (int i=0;i<N;i++)
    		C[i][0]=C[i][i]=1;
    	for (int i=1;i<N;i++)
    		for (int j=1;j<i;j++)
    			C[i][j]=(C[i-1][j-1]+C[i-1][j])%mod;
    	scanf("%d%d",&k,&n);
    	for (int i=2;i<=2*k;i++)
    		if (i&1)
    			printf("%d
    ",Get(i,n,k));
    		else
    			printf("%d
    ",(Get(i-1,n,k-1)+Get(i-1,n-1,k-1))%mod);
    	return 0;
    }
    

      

  • 相关阅读:
    .net项目的svn Global ignore pattern
    Ionic开发中常见问题和解决方案记录
    iOS开发:mac使用svn管理项目
    iOS开发:本地数据存储-NSUserDefaults
    iOS开发:插件记录
    iOS开发:告诉git不要跟踪UserInterfaceState.xcuserstate
    发布 windows 10 universal app 时微软账号验证失败
    iOS开发:UINavigationController常用操作
    iOS开发:Swift多线程NSOperation的使用
    iOS开发:Swift多线程GCD的使用
  • 原文地址:https://www.cnblogs.com/zhouzhendong/p/ARD102E.html
Copyright © 2020-2023  润新知