【arc102E】Stop. Otherwise...
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(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...的更多相关文章
- 【ARC102E】Stop. Otherwise...(容斥原理,动态规划)
[ARC102E]Stop. Otherwise...(容斥原理,动态规划) 题面 AtCoder 有\(n\)个骰子,每个骰子有\(K\)个面,上面有\(1\)到\(K\).骰子都是一样的. 现在对 ...
- Python高手之路【六】python基础之字符串格式化
Python的字符串格式化有两种方式: 百分号方式.format方式 百分号的方式相对来说比较老,而format方式则是比较先进的方式,企图替换古老的方式,目前两者并存.[PEP-3101] This ...
- 【原】谈谈对Objective-C中代理模式的误解
[原]谈谈对Objective-C中代理模式的误解 本文转载请注明出处 —— polobymulberry-博客园 1. 前言 这篇文章主要是对代理模式和委托模式进行了对比,个人认为Objective ...
- 【原】FMDB源码阅读(三)
[原]FMDB源码阅读(三) 本文转载请注明出处 —— polobymulberry-博客园 1. 前言 FMDB比较优秀的地方就在于对多线程的处理.所以这一篇主要是研究FMDB的多线程处理的实现.而 ...
- 【原】Android热更新开源项目Tinker源码解析系列之一:Dex热更新
[原]Android热更新开源项目Tinker源码解析系列之一:Dex热更新 Tinker是微信的第一个开源项目,主要用于安卓应用bug的热修复和功能的迭代. Tinker github地址:http ...
- 【调侃】IOC前世今生
前些天,参与了公司内部小组的一次技术交流,主要是针对<IOC与AOP>,本着学而时习之的态度及积极分享的精神,我就结合一个小故事来初浅地剖析一下我眼中的“IOC前世今生”,以方便初学者能更 ...
- Python高手之路【三】python基础之函数
基本数据类型补充: set 是一个无序且不重复的元素集合 class set(object): """ set() -> new empty set object ...
- Python高手之路【一】初识python
Python简介 1:Python的创始人 Python (英国发音:/ˈpaɪθən/ 美国发音:/ˈpaɪθɑːn/), 是一种解释型.面向对象.动态数据类型的高级程序设计语言,由荷兰人Guido ...
- 【开源】简单4步搞定QQ登录,无需什么代码功底【无语言界限】
说17号发超简单的教程就17号,qq核审通过后就封装了这个,现在放出来~~ 这个是我封装的一个开源项目:https://github.com/dunitian/LoTQQLogin ————————— ...
随机推荐
- CS224n-作业1
0 前言 作业1对应的试题 作业1对应的启动代码 作业1主页 1 Softmax(10分) (a)(5分) 对于向量$x+c$的任一维度$i$,有: \begin{align*}\mbox{softm ...
- Golang 2018.1.2激活及使用技巧
对于做Java开发的同学使用最熟练的开发工具应该当属Eclipse了吧,但是做到后面的话一般都会转用Intellij Idea.至于转用Intellij有什么好处我就不赘述了,简言之就是功能强大,使用 ...
- python FTP服务器实现(Python3)
创建一个ftp.py文件(Linux环境),插入以下代码: from pyftpdlib.authorizers import DummyAuthorizer from pyftpdlib.handl ...
- Nginx中server_name 参数详解
Nginx中的server_name指令主要用于配置基于名称的虚拟主机,server_name指令在接到请求后的匹配顺序分别为: 1.准确的server_name匹配,例如: server { lis ...
- 函数式编程与React高阶组件
相信不少看过一些框架或者是类库的人都有印象,一个函数叫什么creator或者是什么什么createToFuntion,总是接收一个函数,来返回另一个函数.这是一个高阶函数,它可以接收函数可以当参数,也 ...
- Unity发布Windows程序遇到的问题
Unity版本:5.6.2 因为程序中使用了Networking模块,所以在打包发布的时候需要登录Unity的账号,并做设置. 错误信息如下: 解决办法如下: 先登录Unity账号,并在Service ...
- angularJS1笔记-(2)-$watch方法监听变量的变化
html: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF ...
- 理解jquery on 委托事件的机制
前两天做了一个点击任意位置,都能关闭菜单的功能,因为菜单里面的每一个a,的点击事件都是用on绑定的.所以在阻止冒泡的时候不管用,今天特意来理解一下on的机制 on 是委托事件,利用的就是冒泡原理 $( ...
- 为phpstorm安装右侧代码预览工具
打开设置界面,进入到plugins页面,然后再搜索codeglance,然后点击安装即可.
- [转帖] 磁盘IOPS 简介 -- 虽然自己知道有这么一回事 但是自己还是没有系统的总结.
来源: https://www.cnblogs.com/zengkefu/p/5634299.html 机械硬盘的连续读写性很好, 但随机读写性能很差.这是因为磁头移动至正确的磁道上需要时间,随机读写 ...