Portal --> arc102E

Description

  有\(N\)个位置,每个位置可以填一个\(1\sim K\)的数,要求对于每一个\(i\in [2,2K]\),求出任意两个位置的和都不为\(i\)的填法数量对\(998244353\)取模的结果,位置与位置之间没有区别

  

Solution

  一开始想的是容斥。。结果。。实际上并不需要容斥也能直接做

  是道疯狂插板的。。奇妙题目

​  我们可以先考虑一下如果没有任何限制,就只是往\(N\)个位置里面填数,那么其实相当于把\(N\)个位置分配给\(1\sim K\)这\(K\)个数,每个数对应的位置数量\(>=0\),那么直接插板就是\(\binom {N+K-1} {K-1}\),具体为什么的话就是插板本身解决的最裸的问题是把\(n\)个物品分成\(k\)份的方案数为\(\binom {n-1}{k-1}\),也就是\(n-1\)个缝隙里面选\(k-1\)个插个板,这样就分成了\(k\)份了,但是这个计算方式要求每一份的数量\(>=1\),而在这题没有任何限制的情况下,我们每份是要\(>=0\)的,那就直接每份先多加一个,也就是总共加\(K\)个,在最后的分配方案中每组拿走一个就可以得到一个合法的方案了

​  但是现在的问题是有限制,我们将限制用简洁直观一点的语言列出来:

1、一种方案中\(x\)和\(i-x\)不能同时存在

2、如果\(i\)是偶数,那么一种方案中\(\frac{i}{2}\)要么出现\(1\)次要么不出现

​  

​  发现第二个限制其实。。情况很少,所以我们可以把它单独拿出来搞一下,我们在计算前先钦定\(\frac{i}{2}\)的出现次数是\(0\)还是\(1\)(当然如果说\(i\)不是偶数那就不用管了直接算),然后后面就不用管这个数了,那么剩下的问题就变成了这样:有若干对形如\((x,i-x)\)的限制,一对限制中两个数不能同时出现,并且有另外一些数可以随便填,我们要用这些数来填若干个位置

​  这个的话同样也是可以直接用组合数进行计算的,具体一点的话就是:假设限制的数量是\(x\)对(注意这里的\(x\)与上面提到的\(x\)意义不同),另外有\(y\)个数不受限,我们要填\(z\)个位置

​  考虑钦定\(z\)个位置中,哪些位置填的是受限的数字,不妨设这样的位置的数量为\(q\),那么总共有\(\binom x q\cdot 2^q\)种不同的选择方式(从\(x\)对限制中选出\(q\)对,每对可以选择填入第一个数字或者第二个数字),确定了这些受限的数字之后,可填的数字集合就确定了,现在我们总共有\(q+y\)种数字可以填,其中\(q\)种数字必须出现至少一次,其他\(y\)种数字可以不出现,我们现在要将\(z\)个位置分配给不同的数字,那么就又变回前面的插板法了,方案数为\(\binom {z+y-1}{q+y-1}\)

​  所以,对于一对\((x,y,z)\),我们可以枚举\(q\)算出其对应的方案数(记为\(f(x,y,z)\)好了):

\[f(x,y,z)=\sum\limits_{q=0}^z\binom x q\cdot 2^q\cdot \binom{z+y-1}{q+y-1}
\]

​  那么答案就很好求了:

\[Ans_i=\begin{cases}
f(cnt/2,K-cnt,N)&(i\%2=1)\\
\\
f((cnt-1)/2,K-cnt,N)+f((cnt-1)/2,K-cnt,N-1)&(i\%2=0)
\end{cases}
\]

​  其中\(cnt\)表示满足\(i-x\in[1,K]\)且\(x\in[1,K]\)的\(x\)的数量

  

​  mark:(没有什么建设性的东西)多个条件的情况下,可以先按照情况少的那个条件分大类然后再在里面继续讨论其他情况

  

​  代码大概长这个样子

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
const int N=2010,MOD=998244353;
int C[N*2][N*2],pw[N*2];
int n,K,ans;
int plu(int x,int y){return (1LL*x+y)%MOD;}
int mul(int x,int y){return 1LL*x*y%MOD;}
void prework(int n){
C[0][0]=1;
for (int i=1;i<=n;++i){
C[i][0]=1; C[i][i]=1;
for (int j=1;j<i;++j)
C[i][j]=plu(C[i-1][j-1],C[i-1][j]);
}
pw[0]=1;
for (int i=1;i<=n;++i) pw[i]=mul(pw[i-1],2);
}
int f(int x,int y,int z){
if (y<0) return 0;
int ret=0;
for(int q=0;q<=z&&q<=x;++q)
if (q+y-1<=z+y-1&&q+y-1>=0)
ret=plu(ret,mul(C[x][q],mul(pw[q],C[z+y-1][q+y-1])));
return ret;
} int main(){
#ifndef ONLINE_JUDGE
freopen("a.in","r",stdin);
#endif
int cnt;
scanf("%d%d",&K,&n);
prework(n+K);
for (int i=2;i<=2*K;++i){
cnt=0;
for (int j=1;j<=K;++j)
if (1<=i-j&&i-j<=K) ++cnt;
if (i&1)
ans=f(cnt/2,K-cnt,n);
else{
ans=f((cnt-1)/2,K-cnt,n);
ans=plu(ans,f((cnt-1)/2,K-cnt,n-1));
}
printf("%d\n",ans);
}
}

【arc102E】Stop. Otherwise...的更多相关文章

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

    [ARC102E]Stop. Otherwise...(容斥原理,动态规划) 题面 AtCoder 有\(n\)个骰子,每个骰子有\(K\)个面,上面有\(1\)到\(K\).骰子都是一样的. 现在对 ...

  2. Python高手之路【六】python基础之字符串格式化

    Python的字符串格式化有两种方式: 百分号方式.format方式 百分号的方式相对来说比较老,而format方式则是比较先进的方式,企图替换古老的方式,目前两者并存.[PEP-3101] This ...

  3. 【原】谈谈对Objective-C中代理模式的误解

    [原]谈谈对Objective-C中代理模式的误解 本文转载请注明出处 —— polobymulberry-博客园 1. 前言 这篇文章主要是对代理模式和委托模式进行了对比,个人认为Objective ...

  4. 【原】FMDB源码阅读(三)

    [原]FMDB源码阅读(三) 本文转载请注明出处 —— polobymulberry-博客园 1. 前言 FMDB比较优秀的地方就在于对多线程的处理.所以这一篇主要是研究FMDB的多线程处理的实现.而 ...

  5. 【原】Android热更新开源项目Tinker源码解析系列之一:Dex热更新

    [原]Android热更新开源项目Tinker源码解析系列之一:Dex热更新 Tinker是微信的第一个开源项目,主要用于安卓应用bug的热修复和功能的迭代. Tinker github地址:http ...

  6. 【调侃】IOC前世今生

    前些天,参与了公司内部小组的一次技术交流,主要是针对<IOC与AOP>,本着学而时习之的态度及积极分享的精神,我就结合一个小故事来初浅地剖析一下我眼中的“IOC前世今生”,以方便初学者能更 ...

  7. Python高手之路【三】python基础之函数

    基本数据类型补充: set 是一个无序且不重复的元素集合 class set(object): """ set() -> new empty set object ...

  8. Python高手之路【一】初识python

    Python简介 1:Python的创始人 Python (英国发音:/ˈpaɪθən/ 美国发音:/ˈpaɪθɑːn/), 是一种解释型.面向对象.动态数据类型的高级程序设计语言,由荷兰人Guido ...

  9. 【开源】简单4步搞定QQ登录,无需什么代码功底【无语言界限】

    说17号发超简单的教程就17号,qq核审通过后就封装了这个,现在放出来~~ 这个是我封装的一个开源项目:https://github.com/dunitian/LoTQQLogin ————————— ...

随机推荐

  1. 绝对干货!初学者也能看懂的DPDK解析

    欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~ 本文由Willko发表于云+社区专栏 一.网络IO的处境和趋势 从我们用户的使用就可以感受到网速一直在提升,而网络技术的发展也从1GE/10 ...

  2. python清空列表的方法

    1.大数据量的list,要进行局部元素删除,尽量避免用del随机删除,非常影响性能,如果删除量很大,不如直接新建list,然后用下面的方法释放清空旧list. 2.对于一般性数据量超大的list,快速 ...

  3. web04-LoginServlet

    电影网站:www.aikan66.com项目网站:www.aikan66.com游戏网站:www.aikan66.com图片网站:www.aikan66.com书籍网站:www.aikan66.com ...

  4. 使用myeclipse2014整合ss2h

    使用myeclipse2014整合ssh 新建一个webproject 创建过程中注意选择生成web.Xml   先添加struts2的能力 选择都添加过滤器的选项 Core dojo Dwr spr ...

  5. Leetcode题库——27.移除元素

    @author: ZZQ @software: PyCharm @file: removeElement.py @time: 2018/9/23 14:04 要求:给定一个数组 nums 和一个值 v ...

  6. Teamwork(The eighth day of the team)

    在经过算是蛮艰辛的努力后吧,我们终于有了一点点成果.虽然还离理想中的蛮遥远的,但是我们相信,虽然我们走得很慢,但是我们一直都会坚持前进.

  7. 西门子S7系列PLC的主要种类及应用软件

    德国西门子(SIEMENS)公司生产的可编程序控制器在我国的应用也相当广泛,在冶金.化工.印刷生产线等领域都有应用.西门子(SIEMENS)公司的PLC产品包括LOGO,S7-200,S7-300,S ...

  8. vue 实战报错解决方案

    最近做项目,遇到一个问题 列表滚动,上拉加载功能 采用了better-scroll 插件,将better-scroll 封装成组件,采用父组件传递值给子组件的方式,子组件 采用$emit 方式 通知父 ...

  9. PAT 甲级 1064 Complete Binary Search Tree

    https://pintia.cn/problem-sets/994805342720868352/problems/994805407749357568 A Binary Search Tree ( ...

  10. linux使用密文生成os账户

    1.生成账户 [hufangrui@xxx ~]$ openssl passwd -1Password: Verifying - Password: $1$szzkROBZ$GYxffRLp8K5vW ...