枚举 \(i\),然后可以把 \(j\) 和 \(i - j\) 绑定成一对。把一对看成一个整的元素,与别的没有被绑定的数一起来参与选择就可以了。

但是由于实际上一对中的数是可以二选一的,所以不妨令 \(t\) 表示一组方案中出现的对的数的个数,那么有 \(t\) 对数至少出现一次的选择方法的方案数就还需要乘上 \(2^t\)。

令 \(s\) 表示原来的 \(k\) 个数去掉所有的被绑定的对以后的值域的大小,由插板法可以求出,出现了 \(t\) 个对的方案数为:

\[\binom{k}{j}\binom{n+s-1}{t+s-1}\cdot2^t
\]

另外,如果 \(i\) 是偶数,那么 \(\frac i2\) 只能出现一次。可以枚举有没有出现,将之转化为两个子问题。

#include<bits/stdc++.h>

#define fec(i, x, y) (int i = head[x], y = g[i].to; i; i = g[i].ne, y = g[i].to)
#define dbg(...) fprintf(stderr, __VA_ARGS__)
#define File(x) freopen(#x".in", "r", stdin), freopen(#x".out", "w", stdout)
#define fi first
#define se second
#define pb push_back template<typename A, typename B> inline char smax(A &a, const B &b) {return a < b ? a = b , 1 : 0;}
template<typename A, typename B> inline char smin(A &a, const B &b) {return b < a ? a = b , 1 : 0;} typedef long long ll; typedef unsigned long long ull; typedef std::pair<int, int> pii; template<typename I>
inline void read(I &x) {
int f = 0, c;
while (!isdigit(c = getchar())) c == '-' ? f = 1 : 0;
x = c & 15;
while (isdigit(c = getchar())) x = (x << 1) + (x << 3) + (c & 15);
f ? x = -x : 0;
} const int N = 4000 + 7;
const int P = 998244353; int n, k;
int C[N][N]; inline int smod(int x) { return x >= P ? x - P : x;}
inline void sadd(int &x, int y) { x += y; x >= P ? x -= P : x; }
inline void ycl(int n) {
C[0][0] = 1;
for (int i = 1; i <= n; ++i) {
C[i][0] = 1;
for (int j = 1; j <= i; ++j) C[i][j] = smod(C[i - 1][j] + C[i - 1][j - 1]);//, dbg("C(%d, %d) = %d\n", i, j, C[i][j]);
}
} inline int calc(int n, int i, int k) {
int ans = 0;
int lim = std::min(i - 1, k) - (i / 2 + 1) + 1, ss = k - (lim << 1), mul = 1;
// dbg("i = %d, k = %d, lim = %d\n", i, k, lim);
for (int j = 0; j <= lim; ++j) {
sadd(ans, (ll)C[lim][j] * C[n + ss - 1][j + ss - 1] % P * mul % P);
// dbg("W: i = %d, ans = %d\n", i, ans);
mul = smod(mul << 1);
}
return ans;
} inline void work() {
ycl(n + k);
for (int i = 2; i <= (k << 1); ++i)
if (i & 1) printf("%d\n", calc(n, i, k));
else printf("%d\n", smod(calc(n, i - 1, k - 1) + calc(n - 1, i - 1, k - 1)));
} inline void init() {
read(k), read(n);
} int main() {
#ifdef hzhkk
freopen("hkk.in", "r", stdin);
#endif
init();
work();
fclose(stdin), fclose(stdout);
return 0;
}

ARC102E - Stop. Otherwise... 组合计数的更多相关文章

  1. bzoj 2281 [Sdoi2011]黑白棋(博弈+组合计数)

    黑白棋(game) [问题描述] 小A和小B又想到了一个新的游戏. 这个游戏是在一个1*n的棋盘上进行的,棋盘上有k个棋子,一半是黑色,一半是白色. 最左边是白色棋子,最右边是黑色棋子,相邻的棋子颜色 ...

  2. BZOJ 4555: [Tjoi2016&Heoi2016]求和 [分治FFT 组合计数 | 多项式求逆]

    4555: [Tjoi2016&Heoi2016]求和 题意:求\[ \sum_{i=0}^n \sum_{j=0}^i S(i,j)\cdot 2^j\cdot j! \\ S是第二类斯特林 ...

  3. BZOJ 4555: [Tjoi2016&Heoi2016]求和 [FFT 组合计数 容斥原理]

    4555: [Tjoi2016&Heoi2016]求和 题意:求\[ \sum_{i=0}^n \sum_{j=0}^i S(i,j)\cdot 2^j\cdot j! \\ S是第二类斯特林 ...

  4. 【BZOJ5491】[HNOI2019]多边形(模拟,组合计数)

    [HNOI2019]多边形(模拟,组合计数) 题面 洛谷 题解 突然特别想骂人,本来我考场现切了的,结果WA了几个点,刚刚拿代码一看有个地方忘记取模了. 首先发现终止态一定是所有点都向\(n\)连边( ...

  5. [总结]数论和组合计数类数学相关(定理&证明&板子)

    0 写在前面 0.0 前言 由于我太菜了,导致一些东西一学就忘,特开此文来记录下最让我头痛的数学相关问题. 一些引用的文字都注释了原文链接,若侵犯了您的权益,敬请告知:若文章中出现错误,也烦请告知. ...

  6. 【BZOJ5323】[JXOI2018]游戏(组合计数,线性筛)

    [BZOJ5323][JXOI2018]游戏(组合计数,线性筛) 题面 BZOJ 洛谷 题解 显然要考虑的位置只有那些在\([l,r]\)中不存在任意一个约数的数. 假设这样的数有\(x\)个,那么剩 ...

  7. 【BZOJ5305】[HAOI2018]苹果树(组合计数)

    [BZOJ5305][HAOI2018]苹果树(组合计数) 题面 BZOJ 洛谷 题解 考虑对于每条边计算贡献.每条边的贡献是\(size*(n-size)\). 对于某个点\(u\),如果它有一棵大 ...

  8. 【BZOJ3142】[HNOI2013]数列(组合计数)

    [BZOJ3142][HNOI2013]数列(组合计数) 题面 BZOJ 洛谷 题解 唯一考虑的就是把一段值给分配给\(k-1\)天,假设这\(k-1\)天分配好了,第\(i\)天是\(a_i\),假 ...

  9. 【BZOJ4005】[JLOI2015] 骗我呢(容斥,组合计数)

    [BZOJ4005][JLOI2015] 骗我呢(容斥,组合计数) 题面 BZOJ 洛谷 题解 lalaxu #include<iostream> using namespace std; ...

随机推荐

  1. php str_ireplace()函数 语法

    php str_ireplace()函数 语法 作用:字符串替换操作,不区分大小写 语法:str_ireplace(find,replace,string,count)大理石平台规格 参数: 参数 描 ...

  2. 20180715-Java 数组

    double[] myList //首选方法 double myList[] //效果相同,但不是首选方法 该实例完整地展示了如何创建.初始化和操纵数组: public class TestArray ...

  3. Zball in Tina Town

    Zball in Tina Town  Accepts: 356  Submissions: 2463  Time Limit: 3000/1500 MS (Java/Others)  Memory ...

  4. ionic学习使用笔记(二) slide 组件的使用

    开始做的时候,遇到了个要用ionic实现 有一系列的序列需要展示,但是当前页面上只能展示一小部分,剩余的在没有出现时是隐藏的,还得能滑动出现,但是又不能有滚动条. 之前使用jQuery来实现的话,其实 ...

  5. 最长上升子序列(LIS)动态规划

    最长上升子序列 给你n个整数 A1 A2 ········· An 找出在这个数组里面的最长上升的子序列.例如给你(1,7,3,5,9,4,8),他的上升子序列有(1,7) (3,4,8)等等之类的, ...

  6. ORA-01578: ORACLE 数据块损坏 (文件号 10, 块号 57896)ORA-01110: 数据文件 10: '/data/oradata/prod35.dbf'

    https://community.oracle.com/thread/3540795 概述 ------------- 数据库坏块(corruption) 的类型可以按照坏块所属对象的不同,分为用户 ...

  7. Java常用工具——java集合

    一.ArrayList package com.imooc.set; import java.util.ArrayList; import java.util.List; public class A ...

  8. Mybatis入门(附源码压缩包下载)

    首先,来个项目全景预览,文章尾部附上Demo下载链接 [1]pom.xml配置(加入jar包) <project xmlns="http://maven.apache.org/POM/ ...

  9. jmeter3.0+ant1.10+jenkins实现接口自动化并发送邮件

    有很多关于接口自动化的文章,此篇仅用于记录自己的学习用.使用jmeter3.0+ant1.10+jenkins2.实现接口自动化并发送邮件,本篇是用的编写build文件来实现发送邮件,也可以用jenk ...

  10. Git - 暂存区及撤销修改

    1. 暂存区 每个 Git 仓库中,都有一个隐藏目录 .git 用于存放 Git 仓库的相关信息,包括暂存区(称为 stage).自动创建的 master 分支以及指向 master 分支的 HEAD ...