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. 查看、生成 SSH 密钥用于安全登陆

    SSH 可以用来登陆服务器,远程执行命令,并用强加密算法编码保护通信安全,目前广泛应用于远程命令控制.文件加密传输等方面.SSH 登陆服务器的方法一般有两种:密码登陆和密钥登陆. 在受信任的设备上使用 ...

  2. 2019第十届蓝桥杯C++B组题解(赛后重写的,不确保答案正确性,仅供参考)

    先说一下这次的感受吧,我们考场比较乱,开始比赛了,还有的电脑有故障,(向这些人发出同情),第一次认真参加比赛,真正比赛的时候感觉没有那么正式,很乱,各种小问题,(例如博主就没找到题目在哪里,找到后又不 ...

  3. mysql实现oracle sequence方案

    转自: http://blog.csdn.net/javaGirlOne/article/details/47256183 背景:先总结一下MYSQL 自增长与ORACLE 序列的区别: 自增长只能用 ...

  4. Django_rest_framework_渲染器/解析器/路由控制/分页

    目录 渲染器 解析器 路由控制 分页 渲染器 简介 什么是渲染器 根据 用户请求URL 或 用户可接受的类型,筛选出合适的 渲染组件. 渲染器的作用 序列化.友好的展示数据 渲染器配置 首先要在set ...

  5. 20162314 Experiment 2 - Tree

    Experiment report of Besti course:<Program Design & Data Structures> Class: 1623 Student N ...

  6. mysql密码忘记解决方案

    方法:在忘记root密码的时候,可以这样 以windows为例: 1. 关闭正在运行的MySQL服务. 2. 打开DOS窗口,转到mysql\bin目录. 3. 输入mysqld --skip-gra ...

  7. 校园跳蚤市场-Sprint计划

    一.现状 小组成员初步了解所做项目的大致内容,需要时间一步一步分析和规划. 二.部分需求索引卡 第一个阶段完成项目的其中一个模块(商品信息模块). 三.任务认领 产品负责人:林海信 Master:何武 ...

  8. C++ socket网络爬虫(1)

    C++写的socket网络爬虫,代码会在最后一次讲解中提供给大家,同时我也会在写的同时不断的对代码进行完善与修改 我首先向大家讲解如何将网页中的内容,文本,图片等下载到电脑中. 我会教大家如何将百度首 ...

  9. Spring 2.0

    ProductBacklog:继续向下细化; 1.界面美化,统一界面风格,以简洁美观为主: 2.丰富版面的内容,吸引用户: 3.尝试增加新的版面: Sprint 计划会议:确定此次冲刺要完成的目标 1 ...

  10. Selenium_IDE的基本使用及脚本解析

    Selenium确实还是很强大的.根据我以往的经验,这个东西在web测试里的作用还是相当大的.经过近期研究,暂时对基本运作方式有了一定了 解,依旧找个实例记录一下.本段脚本实现的是网易返现个人中心登录 ...