【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 ————————— ...
随机推荐
- Azure-如何排查应用程序网关返回 HTTP Code 502 或客户端得到应用程序网关响应慢的问题(二)
问题描述 经过如何排查应用程序网关返回 HTTP Code 502 或客户端得到应用程序网关响应慢的问题(一)中的排查步骤,可以判断出是由于 Web 服务器自身问题导致的响应异常. 那么可以在 IIS ...
- 【推荐系统】neural_collaborative_filtering(源码解析)
很久没看推荐系统相关的论文了,最近发现一篇2017年的论文,感觉不错. 原始论文 https://arxiv.org/pdf/1708.05031.pdf 网上有翻译了 https://www.cnb ...
- TensorFlow中的卷积函数
前言 最近尝试看TensorFlow中Slim模块的代码,看的比较郁闷,所以试着写点小的代码,动手验证相关的操作,以增加直观性. 卷积函数 slim模块的conv2d函数,是二维卷积接口,顺着源代码可 ...
- Python图形界面开发—wxPython库的布局管理及页面切换
前言 wxPython是基于Python的跨平台GUI扩展库,对wxWidgets( C++ 编写)封装实现.GUI程序的开发中界面布局是很重要的一个部分,合理的页面布局能够给予用户良好使用体验.虽然 ...
- [2019BUAA软工]第0次代码作业
Visual Studio 单元测试的简单应用 写在前面 笔者根据作业的介绍以及Visual Studio 2017 文档的相关说明,进行了Visual Studio 单元测试的简单应用. Tip ...
- java第三次实验
北京电子科技学院(BESTI) 实 验 报 告 课程:Java程序设计 班级:1352 姓名:陈实 学号:20135224 成绩: 指导 ...
- oracle 语句之对数据库的表名就行模糊查询,对查询结果进行遍历,依次获取每个表名结果中的每个字段(存储过程)
语句的执行环境是plsql的sql窗口, 语句的目的是从整个数据库中的所有表判断 不等于某个字段的记录数 . 代码如下: declare s_sql clob:=''; -- 声明一个变量,该变量用于 ...
- springmvc 映射重复
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'org.springfr ...
- 【贪心算法】POJ-1328 区间问题
一.题目 Description Assume the coasting is an infinite straight line. Land is in one side of coasting, ...
- 树莓派与Arduino Leonardo使用NRF24L01无线模块通信之基于RF24库 (三) 全双工通信
设计思路 Arduino Leonardo初始化为发送模式,发送完成后,立即切换为接收模式,不停的监听,收到数据后立即切换为发送模式,若超过一定时间还为接收到数据,则切换为发送模式. 树莓派初始化为接 ...