题目链接: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\)的取值便变得可以出现也可以不出现了

所以骰子点数的出现情况的方案数就是

\[\sum_{q=0}^{cnt}C_{cnt}^q*2^q
\]

接下来考虑对于每一种出现情况的组合数

假设我们当前选了\(q\)个限制组中的元素,我们可以列出下面这样一个方程

\[x_1+x_2+\cdots+x_q+y_1+y_2+\cdots+y_{k-2*cnt}=n
\]

其中\(x1,x2,\cdots,x_q\)表示限制组中元素的出现次数,\(y_1,y_2,\cdots,y_{k-2*cnt}\)表示非限制组中的元素的出现次数

那么依照上面的假设就有\(x_i> 0,y_i\geq 0\),求该方程的解的组数

将方程转化为

\[x_1+x_2+\cdots+x_{cnt}+(y_1+1)+(y_2+1)+\cdots+(y_{k-2*cnt}+1)=n+(k-2*cnt)
\]

那么原问题就变成了一个经典的求方程正整数解的问题了,答案为\(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...的更多相关文章

  1. AtCoder Regular Contest 102

    AtCoder Regular Contest 102 C - Triangular Relationship 题意: 给出n,k求有多少个不大于n的三元组,使其中两两数字的和都是k的倍数,数字可以重 ...

  2. AtCoder Regular Contest 102 (ARC102) E - Stop. Otherwise... 排列组合

    原文链接https://www.cnblogs.com/zhouzhendong/p/ARD102E.html 题目传送门 - ARC102E 题意 有 $n$ 个取值为 $[1,k]$ 的骰子,对于 ...

  3. AtCoder Regular Contest 102 (ARC102) D All Your Paths are Different Lengths 构造

    原文链接https://www.cnblogs.com/zhouzhendong/p/ARC102D.html 题目传送门 - ARC102D 题意 给定 $L$,请你构造一个节点个数为 $n$ ,边 ...

  4. 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 ...

  5. 2018.09.02 Atcoder Regular Contest 102简要题解

    比赛传送门 T1 Triangular Relationship 分析之后发现有两种情况: 1. n为奇数,那么所有数都是k的倍数. 2. n为偶数,那么所有数都是k/2的倍数. 然后就可以愉快A题了 ...

  6. AtCoder Regular Contest 061

    AtCoder Regular Contest 061 C.Many Formulas 题意 给长度不超过\(10\)且由\(0\)到\(9\)数字组成的串S. 可以在两数字间放\(+\)号. 求所有 ...

  7. AtCoder Regular Contest 094 (ARC094) CDE题解

    原文链接http://www.cnblogs.com/zhouzhendong/p/8735114.html $AtCoder\ Regular\ Contest\ 094(ARC094)\ CDE$ ...

  8. AtCoder Regular Contest 092

    AtCoder Regular Contest 092 C - 2D Plane 2N Points 题意: 二维平面上给了\(2N\)个点,其中\(N\)个是\(A\)类点,\(N\)个是\(B\) ...

  9. AtCoder Regular Contest 093

    AtCoder Regular Contest 093 C - Traveling Plan 题意: 给定n个点,求出删去i号点时,按顺序从起点到一号点走到n号点最后回到起点所走的路程是多少. \(n ...

随机推荐

  1. C#.NET 大型通用信息化系统集成快速开发平台 4.1 版本 - 严格的用户账户审核功能

    整个集团有几万个用户,一个个用户添加是不现实的,只有每个公司的系统管理员添加.或者用户申请帐户,然后有相应的管理员审核,才会更准确一些. 每个公司.分公司.部门的账户情况只有所在公司的管理员是最清楚的 ...

  2. JS判断当前设备类型

    CSS3出来后,我们一般都是通过@media媒体查询来实现网页自适应,但是有时候,还是需要我们根据不同的设备来对应的做不同的显示,这时候,我们需要知道当前用户访问我们的界面用的是什么设备,怎么获取呢? ...

  3. PM2用法简介

    简介 PM2是node进程管理工具,可以利用它来简化很多node应用管理的繁琐任务,如性能监控.自动重启.负载均衡等,而且使用非常简单.引用 全局安装 sudo npm install pm2@lat ...

  4. Mysql启动找不到mysql.sock文件问题(Centos7)

    刚装完Mysql5.7,将Mysql添加到开机自启.reboot之后mysql服务却没启动起来, 直接输入mysql –uroot –p ,出现如下错误,找不到mysql.sock文件.用servic ...

  5. 美团面试(c++方向)

    美团后台基本都是java,c++很少的 一面:(其实问了很多,但是很多不记得了) 1.    mfc里边的句柄, Qt里边的信号和槽函数 2.    c 程序的内存分布 3.    堆和栈的区别 4. ...

  6. H5 34-背景图片

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  7. 使用faker去构造一个User-Agent

    faker可以仿造各种各样的信息,可以使用faker去构造一个User-Agent from faker import Factory f = Factory.create() 'User-Agent ...

  8. 安装pandas时出现环境错误

    在安装pandas时出现Could not install packages due to an EnvironmentErrorConsider using the `--user` option ...

  9. spring后置处理器BeanPostProcessor

    BeanPostProcessor的作用是在调用初始化方法的前后添加一些逻辑,这里初始化方法是指在配置文件中配置init-method,或者实现了InitializingBean接口的afterPro ...

  10. Unit 2.前端之html--table(表格),form(表单)标签

    一.table标签 作用:定义html表格.一个table标签元素至少包含 thead(表头),tbody(表主题),还可以有tfoot(表底部) html表格游table元素及一个或者多个tr,th ...