【思路要点】

  • 先考虑一个子问题,在 N∗NN*NN∗N 棋盘的主对角线及其右下方放置 KKK 个不能互相攻击的车,求方案数 f(N,k)f(N,k)f(N,k)。考虑最后一行的放置情况,有递推式 f(N,k)=f(N−1,k)+(N−k+1)∗f(N−1,k−1)f(N,k)=f(N-1,k)+(N-k+1)*f(N-1,k-1)f(N,k)=f(N−1,k)+(N−k+1)∗f(N−1,k−1) 。观察该递推式的形式,不难发现其实际上等于第二类斯特林数 S(N+1,N+1−k)S(N+1,N+1-k)S(N+1,N+1−k) 。
  • 在本题中,首先,象的移动方式不会改变坐标 (x,y)(x,y)(x,y) 对应的 x+yx+yx+y 的奇偶性,我们可以将这两类坐标分开处理,再将结果卷积起来,得到答案。
  • 考虑 x+yx+yx+y 为偶数的坐标,我们将棋盘旋转 454545 度,我们得到了一个类似于上述子问题的问题形式,每一行可以放入车的方格数为 1,1,3,3,5,5,7,7,...1,1,3,3,5,5,7,7,...1,1,3,3,5,5,7,7,... ,换而言之,偶数行的主对角线上是不允许放入棋子的。
  • 考虑对这条新加入的限制进行容斥,记 M=⌊N2⌋M=\lfloor\frac{N}{2}\rfloorM=⌊2N​⌋ ,新问题的方案数为 g(N,K)g(N,K)g(N,K) 。枚举强制放入棋子的方格数 iii ,则有 g(N,k)=∑i=0M(−1)i(Mi)S(N−i+1,N−k+1)g(N,k)=\sum_{i=0}^{M}(-1)^i\binom{M}{i}S(N-i+1,N-k+1)g(N,k)=∑i=0M​(−1)i(iM​)S(N−i+1,N−k+1) 。
  • 展开斯特林数,有 g(N,k)=∑i=0M(−1)i(Mi)1(N−k−1)!∑j=0N−k+1(−1)N−k+1−j(N−k+1j)jN−i+1g(N,k)=\sum_{i=0}^{M}(-1)^i\binom{M}{i}\frac{1}{(N-k-1)!}\sum_{j=0}^{N-k+1}(-1)^{N-k+1-j}\binom{N-k+1}{j}j^{N-i+1}g(N,k)=∑i=0M​(−1)i(iM​)(N−k−1)!1​∑j=0N−k+1​(−1)N−k+1−j(jN−k+1​)jN−i+1 。
  • 交换求和顺序,有 g(N,k)=1(N−k−1)!∑j=0N−k+1(−1)N−k+1−j(N−k+1j)∑i=0M(−1)i(Mi)jN−i+1g(N,k)=\frac{1}{(N-k-1)!}\sum_{j=0}^{N-k+1}(-1)^{N-k+1-j}\binom{N-k+1}{j}\sum_{i=0}^{M}(-1)^{i}\binom{M}{i}j^{N-i+1}g(N,k)=(N−k−1)!1​∑j=0N−k+1​(−1)N−k+1−j(jN−k+1​)∑i=0M​(−1)i(iM​)jN−i+1 。
  • 由二项式定理,有 g(N,k)=1(N−k−1)!∑j=0N−k+1(−1)N−k+1−j(N−k+1j)(j−1)MjN−M+1g(N,k)=\frac{1}{(N-k-1)!}\sum_{j=0}^{N-k+1}(-1)^{N-k+1-j}\binom{N-k+1}{j}(j-1)^Mj^{N-M+1}g(N,k)=(N−k−1)!1​∑j=0N−k+1​(−1)N−k+1−j(jN−k+1​)(j−1)MjN−M+1 。
  • NTTNTTNTT 对其卷积即可,时间复杂度 O(NLogN)O(NLogN)O(NLogN) 。

【代码】

#include<bits/stdc++.h>
using namespace std;
const int MAXN = 262144;
const int P = 998244353;
typedef long long ll;
typedef long double ld;
typedef unsigned long long ull;
template <typename T> void chkmax(T &x, T y) {x = max(x, y); }
template <typename T> void chkmin(T &x, T y) {x = min(x, y); }
template <typename T> void read(T &x) {x = 0; int f = 1;char c = getchar();for (; !isdigit(c); c = getchar()) if (c == '-') f = -f;for (; isdigit(c); c = getchar()) x = x * 10 + c - '0';x *= f;
}
template <typename T> void write(T x) {if (x < 0) x = -x, putchar('-');if (x > 9) write(x / 10);putchar(x % 10 + '0');
}
template <typename T> void writeln(T x) {write(x);puts("");
}
namespace NTT {const int MAXN = 262144;const int P = 998244353;const int G = 3;int power(int x, int y) {if (y == 0) return 1;int tmp = power(x, y / 2);if (y % 2 == 0) return 1ll * tmp * tmp % P;else return 1ll * tmp * tmp % P * x % P;}int N, Log, home[MAXN];void NTTinit() {for (int i = 0; i < N; i++) {int ans = 0, tmp = i;for (int j = 1; j <= Log; j++) {ans <<= 1;ans += tmp & 1;tmp >>= 1;}home[i] = ans;}}void NTT(int *a, int mode) {for (int i = 0; i < N; i++)if (home[i] < i) swap(a[i], a[home[i]]);for (int len = 2; len <= N; len <<= 1) {int delta;if (mode == 1) delta = power(G, (P - 1) / len);else delta = power(G, P - 1 - (P - 1) / len);for (int i = 0; i < N; i += len) {int now = 1;for (int j = i, k = i + len / 2; k < i + len; j++, k++) {int tmp = a[j];int tnp = 1ll * a[k] * now % P;a[j] = (tmp + tnp) % P;a[k] = (tmp - tnp + P) % P;now = 1ll * now * delta % P;}}}if (mode == -1) {int inv = power(N, P - 2);for (int i = 0; i < N; i++)a[i] = 1ll * a[i] * inv % P;}}void times(int *a, int *b, int *c, int limit) {N = 1, Log = 0;while (N < 2 * limit) {N <<= 1;Log++;}for (int i = limit; i < N; i++)a[i] = b[i] = 0;NTTinit();NTT(a, 1);NTT(b, 1);for (int i = 0; i < N; i++)c[i] = 1ll * a[i] * b[i] % P;NTT(c, -1);}
}
int power(int x, int y) {if (y == 0) return 1;int tmp = power(x, y / 2);if (y % 2 == 0) return 1ll * tmp * tmp % P;else return 1ll * tmp * tmp % P * x % P;
}
int fac[MAXN], inv[MAXN];
int odd[MAXN], even[MAXN], res[MAXN];
void update(int &x, int y) {x += y;if (x >= P) x -= P;
}
void init(int n) {fac[0] = 1;for (int i = 1; i <= n; i++)fac[i] = 1ll * fac[i - 1] * i % P;inv[n] = power(fac[n], P - 2);for (int i = n - 1; i >= 0; i--)inv[i] = inv[i + 1] * (i + 1ll) % P;
}
void getans(int n, int *res) {static int a[MAXN], b[MAXN];memset(a, 0, sizeof(a));memset(b, 0, sizeof(b));int m = n / 2;for (int i = 0; i <= n + 1; i++) {a[i] = 1ll * inv[i] * power(i, n - m + 1) % P * power((i - 1 + P) % P, m) % P;b[i] = 1ll * inv[i] * power(P - 1, i) % P;}static int c[MAXN];NTT :: times(a, b, c, n + 2);for (int i = 0; i <= n; i++)res[i] = c[n - i + 1];
}
int main() {int n; read(n);init(n + 1);getans(n, odd);getans(n - 1, even);for (int i = n; i >= 1; i--)update(even[i], 1ll * even[i - 1] * (n - i) % P);NTT :: times(odd, even, res, n + 1);for (int i = 1; i <= 2 * n - 1; i++)printf("%d ", res[i]);return 0;
}

【省内训练2018-11-23】Bishop相关推荐

  1. 《惢客创业日记》2018.11.23(周五) 郭鑫年,你是不是死了?

    今天早上,厨房里突然传出一声大叫:"太好了,第二部就是惢客,郭鑫年有救了."紧接着又是几声大笑. 这个人是我吗?没错,这个人就是我,就是今天早晨进入癫狂状态的我.让我进入癫狂状态的 ...

  2. QIIME 2用户文档. 12训练特征分类器Training feature classifiers(2018.11)

    文章目录 前情提要 训练特征分类器 下载并导入参考序列 提取参考序列 训练分类集 测试分类集 分类真菌ITS序列 Reference 译者简介 猜你喜欢 写在后面 前情提要 QIIME 2可重复.交互 ...

  3. 暑期训练日志----2018.8.23

    训练第25天. 上午把前两天的区间 DP 和状压 DP 又看了一遍,加深一下理解 中午有点困就回去睡觉,果不其然的睡过了...一下午基本啥都没干...难受 晚上把前天比赛的题解写了写,昨天的比赛明天上 ...

  4. 训练日志 2018.11.28

    并查集.2-SAT.二分图相关内容都看完了,但只做了些并查集.二分图判定.二分图最大匹配的题,其他内容仍需多做些题来验证一下,只剩差分约束和网络流内容没看,考试周快来了,这周先尽量看吧.. 天冷了,这 ...

  5. 训练日志 2018.11.14

    这周的计划是 Ford.SPFA 看完了,2-SAT 看了一半,并查集没按计划完成,但把最小生成树看了,还算可以... 下周 2-SAT.次短路径.并查集... 今晚打比赛..菜的一批...做了 4. ...

  6. 训练日志 2018.11.7

    原计划的图的遍历和拓扑排序看完了,顺便把 Floyd 和 Dijkstra 看完了,这周计划是 Ford.SPFA.并查集以及 2-SAT 问题 学长学姐去 ICPC 拿了块牌回来,羡慕 自己队出去比 ...

  7. QIIME 2用户文档. 18使用q2-vsearch聚类OTUs(2018.11)

    文章目录 前情提要 使用`q2-vsearch`聚类序列为OTUs 下载数据 序列去冗余 特征[频率]和特征数据[序列]的聚类 无参聚类 有参聚类 半有参聚类 Reference 译者简介 猜你喜欢 ...

  8. QIIME 2用户文档. 17序列双端合并read-joining(2018.11)

    文章目录 前情提要 序列双端合并的另一种方法`read-joining` 数据下载 序列合并 查看合并序列的数据质量和摘要 序列质控 Deblur 查看Deblur特征表 导入双端合并的序列 导入序列 ...

  9. QIIME 2用户文档. 16鉴定和过滤嵌合体序列q2-vsearch(2018.11)

    文章目录 前情提要 鉴定和过滤嵌合体序列`q2-vsearch` 数据下载 无参嵌合体鉴定 可视化统计结果 过滤特征表和序列 过滤嵌合体和可疑序列 过滤嵌合但保留可疑序列 Reference 译者简介 ...

  10. QIIME 2用户文档. 15进行纵向和成对样本比较q2-longitudinal(2018.11)

    文章目录 前情提要 进行纵向和成对样本比较`q2-longitudinal` 成对差异比较 线性混合效应模型 波动性分析 跟踪变化率的第一个差异 从静态时间点跟踪变化率 非参数微生物相关性试验(NMI ...

最新文章

  1. 某程序员吐槽:潮汕女朋友狮子大开口要18万8彩礼,而且只能男友父母出,不能男友出!...
  2. server2016 查看图片 预览图片
  3. 机器学习(MACHINE LEARNING) 【周志华版-”西瓜书“-笔记】 DAY1-绪论
  4. 后盾网lavarel视频项目---vue实现动态添加和删除板块
  5. PHP学习笔记1.2——预定义变量参考
  6. python 遍历xml所有节点
  7. sklearn中的分类决策树
  8. 对于拷贝构造函数和赋值构造函数的理解
  9. SQL9 查找除复旦大学的用户信息(数据库否定语句写法)
  10. FOJ 1887 景区摊位安排问题
  11. leecode第二百九十二题(Nim游戏)
  12. 周立功USBCAN资料分享
  13. 石文软件测试,石文软件基本操作
  14. 仿京东的注册页面, 使用jQuery进行表单验证
  15. 【​观察】做好数据到介质的连接者 新数据时代浪潮存储的行与思
  16. H5动画实现---过渡
  17. 浅谈go语言交叉编译
  18. 基于php的外卖订餐系统开题报告_校园网上订餐系统的设计与实现(PHP,MySQL)
  19. R语言可视化散点图、使用ggrepel包的geom_text_repel函数避免数据点之间的标签互相重叠(设置min.segment.length参数为Inf不添加标签线段)
  20. 【阅读笔记】后真相时代的竞争性真相

热门文章

  1. 一文读懂知识图谱的商业应用进程及技术背景
  2. 微信朋友圈文章可能构成「现有技术公开」而导致专利权丧失
  3. matlab特征检测,sift特征检测的matlab程序实现
  4. 开源免费OA系统:主要配置文件说明(一)
  5. 高中数学必修2知识点总结:第四章圆与方程
  6. 利用Cloudflare + Python 免费开启(IPV4/IPV6)DDNS
  7. linux 腾达驱动程序,腾达(Tenda)U6网卡驱动(Linux)
  8. CSS属性详解——使用border属性设置边框
  9. 序贯高斯模拟和普通克里格法的区别
  10. 【Unity】2D游戏-愤怒的小鸟教学实战(附源码和实现步骤 超详细)