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 ...
随机推荐
- 牛客---java练习
一. 1. abstract可以修饰方法和类,不能修饰属性.抽象方法没有方法体,即没有大括号{}.抽象类中的成员属性都是public static final类型的:成员方法都是public abst ...
- JDK8-新特性-附demo
import java.nio.charset.StandardCharsets; import java.util.ArrayList; import java.util.Base64; impor ...
- Linux下查看文件系统磁盘使用
[root@localhost ~]# df -h 可以查看所有文件系统的磁盘使用情况 du --max-depth=1 -h 可以查看当前目录下各子目录的磁盘使用情况 参考:http://www.2 ...
- 【学习总结】之 3Blue1Brown系列
刷知乎看到的,各种力荐. YouTube: https://www.youtube.com/channel/UCYO_jab_esuFRV4b17AJtAw/featured B站: https:// ...
- Vagrant系列(二)----Vagrant的配置文件Vagrantfile详解
一.简介 在我们的工作目录下有一个Vagrantfile文件,里面包含有大量的配置信息,通过它可以定义虚拟机的各种配置,如网络.内存.主机名等,主要包括三个方面的配置,虚拟机的配置.SSH配置.Vag ...
- python raise
当程序出现错误,python会自动引发异常,也可以通过raise显示地引发异常.一旦执行了raise语句,raise后面的语句将不能执行. 演示raise用法 try: s = None if s ...
- python学习笔记(2)--基本语法元素
来看一个非常简单的温度转换程序 #Tempconvert.py tempstr = input("输入:") if tempstr[-1] in ['F', 'f']: C = ( ...
- JQ获取URL中是否含有某个字符的话,对页面进行某种操作
一.//JQ获取URL中是否含有某个字符的话,对页面进行某种操作 例:如果URL中含有xia的字符,就在页面引入一个cssvar str=window.location.href; //获取地址栏UR ...
- python好文章
http://blog.csdn.net/csdnnews/article/details/78557392
- easyui combobox 在datagrid中动态加载数据
场景:datagrid 中用编辑框修改数据,有一个列使用的combobox 在可编辑的时候需要动态绑定数据,这个数据是在根据其他条件可变的 思路:在每次开启编辑框的时候动态绑定数据, datagri ...