「CTS2019」珍珠
「CTS2019」珍珠
解题思路
看了好多博客才会,问题即要求有多少种方案满足数量为奇数的变量数 \(\leq n-2m\)。考虑容斥,令 \(F(k)\) 为恰好有 \(n\) 个变量数量为奇数的方案数,\(G(k)\) 为钦点了 \(k\) 种变量的选法且它们数量都是奇数,剩下的变量随便组合的方案数。
那么,
\]
显然 \(F, G\) 之间满足以下关系:
F(k) =\sum_{i=k}^D {i\choose k}(-1)^{i-k}G(i)
\]
第二个式子是一个经典卷积,所以只要求出 \(G\) 做多项式乘法就可以快速得到答案了。
考虑钦点的变量是有标号集合的拼接,用指数型生成函数 \(\frac{e^{x}-e^{-x}}{2}\) 的形式表示单个变量数量为奇数的选法,\(e^x\) 表示剩下变量随便选的选法,于是
=[x^n]\frac{1}{2^k}{D \choose k}(e^x-e^{-x})^ke^{x(D-k)}
\]
二项式展开可以得到
=[x^n]\frac{1}{2^k}{D \choose k}\sum_{i=0}^k{k \choose i}(-1)^ie^{x(D-2i)} \\
=\frac{1}{2^k}{D \choose k}\sum_{i=0}^k{k \choose i}(-1)^i(D-2i)^n
\]
发现是一个卷积的形式,也只需要一遍多项式乘法。
code
/*program by mangoyang*/
#include <bits/stdc++.h>
#define inf (0x7f7f7f7f)
#define Max(a, b) ((a) > (b) ? (a) : (b))
#define Min(a, b) ((a) < (b) ? (a) : (b))
typedef long long ll;
using namespace std;
template <class T>
inline void read(T &x){
int ch = 0, f = 0; x = 0;
for(; !isdigit(ch); ch = getchar()) if(ch == '-') f = 1;
for(; isdigit(ch); ch = getchar()) x = x * 10 + ch - 48;
if(f) x = -x;
}
const int N = 1 << 19, mod = 998244353, G = 3;
int a[N], b[N], js[N], inv[N], n, m, D, ans;
namespace poly{
int rev[1<<22], len, lg;
inline int Pow(int a, int b){
int ans = 1;
for(; b; b >>= 1, a = 1ll * a * a % mod)
if(b & 1) ans = 1ll * ans * a % mod;
return ans;
}
inline void timesinit(int lenth){
for(len = 1, lg = 0; len <= lenth; len <<= 1, lg++);
for(int i = 0; i < len; i++)
rev[i] = (rev[i>>1] >> 1) | ((i & 1) << (lg - 1));
}
inline void dft(int *a, int sgn){
for(int i = 0; i < len; i++)
if(i < rev[i]) swap(a[i], a[rev[i]]);
for(int k = 2; k <= len; k <<= 1){
int w = Pow(G, (mod - 1) / k);
if(sgn == -1) w = Pow(w, mod - 2);
for(int i = 0; i < len; i += k){
int now = 1;
for(int j = i; j < i + (k >> 1); j++){
int x = a[j], y = 1ll * a[j+(k>>1)] * now % mod;
a[j] = x + y >= mod ? x + y - mod : x + y;
a[j+(k>>1)] = x - y < 0 ? x - y + mod : x - y;
now = 1ll * now * w % mod;
}
}
}
if(sgn == -1){
int Inv = Pow(len, mod - 2);
for(int i = 0; i < len; i++) a[i] = 1ll * a[i] * Inv % mod;
}
}
}
using poly::timesinit;
using poly::Pow;
using poly::dft;
int main(){
read(D), read(n), read(m);
js[0] = 1, inv[0] = 1;
for(int i = 1; i <= D; i++){
js[i] = 1ll * js[i-1] * i % mod;
inv[i] = Pow(js[i], mod - 2);
}
for(int i = 0; i <= D; i++){
a[i] = 1ll * inv[i] * Pow((D - 2 * i + mod) % mod, n) % mod;
if(i & 1) a[i] = mod - a[i];
b[i] = inv[i];
}
timesinit(D + D + 1);
dft(a, 1), dft(b, 1);
for(int i = 0; i < poly::len; i++)
a[i] = 1ll * a[i] * b[i] % mod;
dft(a, -1);
for(int i = D + 1; i < poly::len; i++) a[i] = 0;
for(int i = 0; i <= D; i++){
a[i] = 1ll * a[i] * Pow(Pow(2, i), mod - 2) % mod;
a[i] = 1ll * a[i] * js[D] % mod * inv[i] % mod * inv[D-i] % mod;
a[i] = 1ll * a[i] * js[i] % mod;
a[i] = 1ll * a[i] * js[i] % mod;
if(i & 1) a[i] = (mod - a[i]) % mod;
}
reverse(a, a + D + 1);
dft(a, 1);
for(int i = 0; i < poly::len; i++)
a[i] = 1ll * a[i] * b[i] % mod;
dft(a, -1);
for(int i = 0; i <= min(n - 2 * m, D); i++){
int x = 1ll * a[D-i] * inv[i] % mod;
if(i & 1) x = (mod - x) % mod;
ans = (ans + x) % mod;
}
cout << ans << endl;
return 0;
}
「CTS2019」珍珠的更多相关文章
- LOJ3120. 「CTS2019」珍珠 [容斥,生成函数]
传送门 思路 非常显然,就是要统计有多少种方式使得奇数的个数不超过\(n-2m\).(考场上这个都没想到真是身败名裂了--) 考虑直接减去钦点\(n-2m+1\)个奇数之后的方案数,但显然这样会算重, ...
- Solution -「CTS2019」珍珠
题目 luogu. 题解 先 % 兔.同为兔子为什么小粉兔辣么强qwq. 本文大体跟随小粉兔的题解的思路,并为像我一样多项式超 poor 的读者作了很详细的解释.如果题解界面公式出现问题,可以 ...
- 「CTS2019」氪金手游
「CTS2019」氪金手游 解题思路 考场上想出了外向树的做法,居然没意识到反向边可以容斥,其实外向树会做的话这个题差不多就做完了. 令 \(dp[u][i]\) 表示单独考虑 \(u\) 节点所在子 ...
- Loj #3124. 「CTS2019 | CTSC2019」氪金手游
Loj #3124. 「CTS2019 | CTSC2019」氪金手游 题目描述 小刘同学是一个喜欢氪金手游的男孩子. 他最近迷上了一个新游戏,游戏的内容就是不断地抽卡.现在已知: - 卡池里总共有 ...
- 「CTS2019 | CTSC2019」氪金手游 解题报告
「CTS2019 | CTSC2019」氪金手游 降 智 好 题 ... 考场上签到失败了,没想容斥就只打了20分暴力... 考虑一个事情,你抽中一个度为0的点,相当于把这个点删掉了(当然你也只能抽中 ...
- 「CTS2019 | CTSC2019」随机立方体 解题报告
「CTS2019 | CTSC2019」随机立方体 据说这是签到题,但是我计数学的实在有点差,这里认真说一说. 我们先考虑一些事实 如果我们在位置\((x_0,y_0,z_0)\)钦定了一个极大数\( ...
- 「译」JUnit 5 系列:条件测试
原文地址:http://blog.codefx.org/libraries/junit-5-conditions/ 原文日期:08, May, 2016 译文首发:Linesh 的博客:「译」JUni ...
- 「译」JUnit 5 系列:扩展模型(Extension Model)
原文地址:http://blog.codefx.org/design/architecture/junit-5-extension-model/ 原文日期:11, Apr, 2016 译文首发:Lin ...
- JavaScript OOP 之「创建对象」
工厂模式 工厂模式是软件工程领域一种广为人知的设计模式,这种模式抽象了创建具体对象的过程.工厂模式虽然解决了创建多个相似对象的问题,但却没有解决对象识别的问题. function createPers ...
随机推荐
- Android App专项测试
https://www.jianshu.com/p/141b84f14505 http://www.cnblogs.com/finer/p/9601140.html 专项 概念 adb命令 App启动 ...
- 《Hadoop综合大作业》
作业要求来自于:https://edu.cnblogs.com/campus/gzcc/GZCC-16SE2/homework/3339 我主要的爬取内容是关于热门微博文章“996”与日剧<我要 ...
- LDD3源码分析之poll分析
编译环境:Ubuntu 10.10 内核版本:2.6.32-38-generic-pae LDD3源码路径:examples/scull/pipe.c examples/scull/main.c 本 ...
- 常见的SQL优化面试题
1.在表中建立索引,优先考虑where.group by使用到的字段. 2.查询条件中,一定不要使用select *,因为会返回过多无用的字段会降低查询效率.应该使用具体的字段代替*,只返回使用到的字 ...
- odoo开发笔记--form视图按钮样例
如图: 对应后台views视图,class可选内容值: class="oe_highlight" class="btn-xs" class="btn- ...
- java使用ssh连接Linux并执行命令
方式1:通过设置账号密码和链接地址 maven pom.xml配置: <dependency> <groupId>com.jcraft</groupId ...
- ttyS 串口名称被占用
ttyS 的串口设备名称,我一直觉得是没有问题的,今天才想起来,8250驱动命名了 ttyS的名称,需要将 8250 的驱动删除 , ttyS 的串口名称即可正常使用. 如下 这样 ttyS 的名称即 ...
- Python3基础 yield next 获取生成器生出的值
Python : 3.7.3 OS : Ubuntu 18.04.2 LTS IDE : pycharm-community-2019.1.3 ...
- Shenzhen Wanze Technology Co., Ltd.技术支持
本网页为Shenzhen Wanze Technology Co., Ltd.团队的技术支持网址,如果在我们开发的游戏中遇到任何问题,欢迎联系我们! QQ:2535510006 邮箱:25355100 ...
- postman做接口测试 application/x-www-form-urlencoded 格式与json格式互转
背景:用postman做接口测试可以使用application/x-www-form-urlencoded请求,也可以使用json请求,接口文档如下: 请求参数 字段 类型 是否必填 注释 websi ...