AtCoder Regular Contest 102 E Stop. Otherwise...
题目链接:atcoder
大意:有\(n\)个骰子,每个骰子上面有\(k\)个数,分别是\(1\text ~ k\),现在求\(\forall i\in[2...2k]\),求出有多少种骰子点数的组合方式使得任意两个骰子的点数之和不等于\(i\),注意不考虑顺序
分析
对每个\(i\)计算答案
我们知道,如果\(1\leq j \leq i\)且\(1\leq i-j \leq i\)那么\(j\)和\(i-j\)最多只能出现一个
我们对于每个\(i\)计算出有多少组\((j,i-j)\)满足上面的限制条件,记为\(cnt\)
那么对于剩下的\(k-2*cnt\)的取值便变得可以出现也可以不出现了
所以骰子点数的出现情况的方案数就是
\]
接下来考虑对于每一种出现情况的组合数
假设我们当前选了\(q\)个限制组中的元素,我们可以列出下面这样一个方程
\]
其中\(x1,x2,\cdots,x_q\)表示限制组中元素的出现次数,\(y_1,y_2,\cdots,y_{k-2*cnt}\)表示非限制组中的元素的出现次数
那么依照上面的假设就有\(x_i> 0,y_i\geq 0\),求该方程的解的组数
将方程转化为
\]
那么原问题就变成了一个经典的求方程正整数解的问题了,答案为\(C_{n+k-2*cnt-1}^{k-cnt-1}\)
将两者乘起来即可
注意当\(i\)是偶数的时候,会出现\((i/2,i/2)\)这样的一组无意义的限制组,我们可以强制令其取或不取(取最多也只有1个),然后和上面一样的求解
时间复杂度\(O(n^2)\)
#include<iostream>
#include<string.h>
#include<string>
#include<stdio.h>
#include<algorithm>
#include<math.h>
#include<vector>
#include<queue>
#include<map>
using namespace std;
const int maxd=998244353,N=100000;
const double pi=acos(-1.0);
typedef long long ll;
int n,k,c[4010][4010],bin[4010];
int read()
{
int x=0,f=1;char ch=getchar();
while ((ch<'0') || (ch>'9')) {if (ch=='-') f=-1;ch=getchar();}
while ((ch>='0') && (ch<='9')) {x=x*10+(ch-'0');ch=getchar();}
return x*f;
}
void init()
{
k=read();n=read();
int i,j;
c[0][0]=1;
for (i=1;i<=4000;i++)
{
c[i][0]=1;
for (j=1;j<=i;j++)
c[i][j]=((ll)c[i-1][j]+c[i-1][j-1])%maxd;
}
bin[0]=1;
for (i=1;i<=4000;i++) bin[i]=(bin[i-1]*2)%maxd;
//for (i=1;i<=6;i++) cout << bin[i] << " ";cout << endl;
}
ll calc(int x,int y,int z)
{
if (y<0) return 0;
//cout << x << " " << y << " " << z << endl;
int i;ll ans=0;
for (i=0;i<=x&&i<=z;i++)
{
if (((i+y-1)>=0) && ((i+y-1)<=(z+y-1)))
{
//cout << i << " " << x << " " << y << " " << z << endl;
ans=(ans+((1ll*c[x][i]*bin[i])%maxd*c[z+y-1][i+y-1])%maxd)%maxd;
}
}
return ans;
}
void work()
{
int i,j;
for (i=2;i<=k*2;i++)
{
ll ans=0;int cnt=0;
for (j=1;j<=k;j++)
{
int tmp=i-j;
if ((tmp<=k) && (tmp>=1)) cnt++;
}
//cout << i << " " << cnt << endl;
if (i&1)
ans=calc(cnt/2,k-cnt,n);
else
ans=(calc((cnt-1)/2,k-cnt,n)+calc((cnt-1)/2,k-cnt,n-1))%maxd;
printf("%lld\n",ans);
}
}
int main()
{
init();
work();
return 0;
}
AtCoder Regular Contest 102 E Stop. Otherwise...的更多相关文章
- AtCoder Regular Contest 102
AtCoder Regular Contest 102 C - Triangular Relationship 题意: 给出n,k求有多少个不大于n的三元组,使其中两两数字的和都是k的倍数,数字可以重 ...
- AtCoder Regular Contest 102 (ARC102) E - Stop. Otherwise... 排列组合
原文链接https://www.cnblogs.com/zhouzhendong/p/ARD102E.html 题目传送门 - ARC102E 题意 有 $n$ 个取值为 $[1,k]$ 的骰子,对于 ...
- AtCoder Regular Contest 102 (ARC102) D All Your Paths are Different Lengths 构造
原文链接https://www.cnblogs.com/zhouzhendong/p/ARC102D.html 题目传送门 - ARC102D 题意 给定 $L$,请你构造一个节点个数为 $n$ ,边 ...
- AtCoder Regular Contest 102 D - All Your Paths are Different Lengths
D - All Your Paths are Different Lengths 思路: 二进制构造 首先找到最大的t,使得2^t <= l 然后我们就能构造一种方法使得正好存在 0 到 2^t ...
- 2018.09.02 Atcoder Regular Contest 102简要题解
比赛传送门 T1 Triangular Relationship 分析之后发现有两种情况: 1. n为奇数,那么所有数都是k的倍数. 2. n为偶数,那么所有数都是k/2的倍数. 然后就可以愉快A题了 ...
- AtCoder Regular Contest 061
AtCoder Regular Contest 061 C.Many Formulas 题意 给长度不超过\(10\)且由\(0\)到\(9\)数字组成的串S. 可以在两数字间放\(+\)号. 求所有 ...
- AtCoder Regular Contest 094 (ARC094) CDE题解
原文链接http://www.cnblogs.com/zhouzhendong/p/8735114.html $AtCoder\ Regular\ Contest\ 094(ARC094)\ CDE$ ...
- AtCoder Regular Contest 092
AtCoder Regular Contest 092 C - 2D Plane 2N Points 题意: 二维平面上给了\(2N\)个点,其中\(N\)个是\(A\)类点,\(N\)个是\(B\) ...
- AtCoder Regular Contest 093
AtCoder Regular Contest 093 C - Traveling Plan 题意: 给定n个点,求出删去i号点时,按顺序从起点到一号点走到n号点最后回到起点所走的路程是多少. \(n ...
随机推荐
- python第八章:多任务--小白博客
多线程threading 多线程特点: #线程的并发是利用cpu上下文的切换(是并发,不是并行)#多线程执行的顺序是无序的#多线程共享全局变量#线程是继承在进程里的,没有进程就没有线程#GIL全局解释 ...
- python三:循环语句练习--小白博客
# 打印0-10去掉5 count = - : count += : continue print(count) # 打印0-10的偶数 count = : print(count) count+= ...
- 使用C# HttpWebRequest进行多线程网页提交。Async httpclient/HttpWebRequest实现批量任务的发布及异步提交和超时取消
使用线程池并发处理request请求及错误重试,使用委托处理UI界面输出. http://www.cnblogs.com/Charltsing/p/httpwebrequest.html for (i ...
- 砝码组合(dfs)
砝码组合 题目内容:用天平称重时,我们希望用尽可能少的砝码组合称出尽可能多的重量.如果只有5个砝码,重量分别是1,3,9,27,81.则它们可以组合称出1到121之间任意整数重量(砝码允许放在左右两 ...
- Java Core - Map接口
Map:是一组映射The java.util.Map interface represents a mapping between a key and a value. The Map interfa ...
- C#中闭包的陷阱
我们在使用lambda的时候会遇到闭包,在闭包中有一个陷阱是在for循环中产生的,先上代码: class Program { static void Main(string[] args) { Act ...
- mybatis数据源与连接池
1.概念介绍1.1 数据源:顾名思义,数据的来源,它包含了数据库类型信息,位置和数据等信息,一个数据源对应一个数据库. 1.2 连接池:在做持久化操作时,需要通过数据库连接对象来连接数据库,而连接池就 ...
- jackson使用问题:mapper.readValue()将JSON字符串转反序列化为对象失败或异常
问题根源:转化目标实体类的属性要与被转JSON字符串总的字段 一 一对应!字符串里可以少字段,但绝对不能多字段. 先附上我这段出现了问题的源码: // 1.接收并转化相应的参数.需要在pom.xml中 ...
- kdump简单的介绍
kdump是2.6.16之后,内核引入的一种新的内核崩溃现场信息收集工具.当一个内核崩溃后(我们称之为panic),内核会使用kexec(类似于进程的exec,把当前内核换掉)进入到一个干净的备份内核 ...
- 使用getopts处理输入参数
在编写shell脚本中,需要输入参数,使用过程中,getopts更加方便.可以很好的处理用户输入的参数和参数值. 参加如下一段脚本: #!/bin/bash while getopts ": ...