「CTS2019」珍珠

解题思路

看了好多博客才会,问题即要求有多少种方案满足数量为奇数的变量数 \(\leq n-2m\)。考虑容斥,令 \(F(k)\) 为恰好有 \(n\) 个变量数量为奇数的方案数,\(G(k)\) 为钦点了 \(k\) 种变量的选法且它们数量都是奇数,剩下的变量随便组合的方案数。

那么,

\[Ans = \sum_{i=0}^{\min(n-2m,D)} F(i)
\]

显然 \(F, G​\) 之间满足以下关系:

\[G(k) =\sum_{i=k}^D {i\choose k} F(i) \\
F(k) =\sum_{i=k}^D {i\choose k}(-1)^{i-k}G(i)
\]

第二个式子是一个经典卷积,所以只要求出 \(G\) 做多项式乘法就可以快速得到答案了。

考虑钦点的变量是有标号集合的拼接,用指数型生成函数 \(\frac{e^{x}-e^{-x}}{2}\) 的形式表示单个变量数量为奇数的选法,\(e^x\) 表示剩下变量随便选的选法,于是

\[G(k)=[x^n]{D \choose k}(\frac{e^x-e^{-x}}{2})^ke^{x(D-k)} \\
=[x^n]\frac{1}{2^k}{D \choose k}(e^x-e^{-x})^ke^{x(D-k)}
\]

二项式展开可以得到

\[G(k)=[x^n]\frac{1}{2^k}{D \choose k}\sum_{i=0}^k{k \choose i}(-1)^ie^{x(k-2i)}e^{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

  1. /*program by mangoyang*/
  2. #include <bits/stdc++.h>
  3. #define inf (0x7f7f7f7f)
  4. #define Max(a, b) ((a) > (b) ? (a) : (b))
  5. #define Min(a, b) ((a) < (b) ? (a) : (b))
  6. typedef long long ll;
  7. using namespace std;
  8. template <class T>
  9. inline void read(T &x){
  10. int ch = 0, f = 0; x = 0;
  11. for(; !isdigit(ch); ch = getchar()) if(ch == '-') f = 1;
  12. for(; isdigit(ch); ch = getchar()) x = x * 10 + ch - 48;
  13. if(f) x = -x;
  14. }
  15. const int N = 1 << 19, mod = 998244353, G = 3;
  16. int a[N], b[N], js[N], inv[N], n, m, D, ans;
  17. namespace poly{
  18. int rev[1<<22], len, lg;
  19. inline int Pow(int a, int b){
  20. int ans = 1;
  21. for(; b; b >>= 1, a = 1ll * a * a % mod)
  22. if(b & 1) ans = 1ll * ans * a % mod;
  23. return ans;
  24. }
  25. inline void timesinit(int lenth){
  26. for(len = 1, lg = 0; len <= lenth; len <<= 1, lg++);
  27. for(int i = 0; i < len; i++)
  28. rev[i] = (rev[i>>1] >> 1) | ((i & 1) << (lg - 1));
  29. }
  30. inline void dft(int *a, int sgn){
  31. for(int i = 0; i < len; i++)
  32. if(i < rev[i]) swap(a[i], a[rev[i]]);
  33. for(int k = 2; k <= len; k <<= 1){
  34. int w = Pow(G, (mod - 1) / k);
  35. if(sgn == -1) w = Pow(w, mod - 2);
  36. for(int i = 0; i < len; i += k){
  37. int now = 1;
  38. for(int j = i; j < i + (k >> 1); j++){
  39. int x = a[j], y = 1ll * a[j+(k>>1)] * now % mod;
  40. a[j] = x + y >= mod ? x + y - mod : x + y;
  41. a[j+(k>>1)] = x - y < 0 ? x - y + mod : x - y;
  42. now = 1ll * now * w % mod;
  43. }
  44. }
  45. }
  46. if(sgn == -1){
  47. int Inv = Pow(len, mod - 2);
  48. for(int i = 0; i < len; i++) a[i] = 1ll * a[i] * Inv % mod;
  49. }
  50. }
  51. }
  52. using poly::timesinit;
  53. using poly::Pow;
  54. using poly::dft;
  55. int main(){
  56. read(D), read(n), read(m);
  57. js[0] = 1, inv[0] = 1;
  58. for(int i = 1; i <= D; i++){
  59. js[i] = 1ll * js[i-1] * i % mod;
  60. inv[i] = Pow(js[i], mod - 2);
  61. }
  62. for(int i = 0; i <= D; i++){
  63. a[i] = 1ll * inv[i] * Pow((D - 2 * i + mod) % mod, n) % mod;
  64. if(i & 1) a[i] = mod - a[i];
  65. b[i] = inv[i];
  66. }
  67. timesinit(D + D + 1);
  68. dft(a, 1), dft(b, 1);
  69. for(int i = 0; i < poly::len; i++)
  70. a[i] = 1ll * a[i] * b[i] % mod;
  71. dft(a, -1);
  72. for(int i = D + 1; i < poly::len; i++) a[i] = 0;
  73. for(int i = 0; i <= D; i++){
  74. a[i] = 1ll * a[i] * Pow(Pow(2, i), mod - 2) % mod;
  75. a[i] = 1ll * a[i] * js[D] % mod * inv[i] % mod * inv[D-i] % mod;
  76. a[i] = 1ll * a[i] * js[i] % mod;
  77. a[i] = 1ll * a[i] * js[i] % mod;
  78. if(i & 1) a[i] = (mod - a[i]) % mod;
  79. }
  80. reverse(a, a + D + 1);
  81. dft(a, 1);
  82. for(int i = 0; i < poly::len; i++)
  83. a[i] = 1ll * a[i] * b[i] % mod;
  84. dft(a, -1);
  85. for(int i = 0; i <= min(n - 2 * m, D); i++){
  86. int x = 1ll * a[D-i] * inv[i] % mod;
  87. if(i & 1) x = (mod - x) % mod;
  88. ans = (ans + x) % mod;
  89. }
  90. cout << ans << endl;
  91. return 0;
  92. }

「CTS2019」珍珠的更多相关文章

  1. LOJ3120. 「CTS2019」珍珠 [容斥,生成函数]

    传送门 思路 非常显然,就是要统计有多少种方式使得奇数的个数不超过\(n-2m\).(考场上这个都没想到真是身败名裂了--) 考虑直接减去钦点\(n-2m+1\)个奇数之后的方案数,但显然这样会算重, ...

  2. Solution -「CTS2019」珍珠

    题目   luogu. 题解   先 % 兔.同为兔子为什么小粉兔辣么强qwq. 本文大体跟随小粉兔的题解的思路,并为像我一样多项式超 poor 的读者作了很详细的解释.如果题解界面公式出现问题,可以 ...

  3. 「CTS2019」氪金手游

    「CTS2019」氪金手游 解题思路 考场上想出了外向树的做法,居然没意识到反向边可以容斥,其实外向树会做的话这个题差不多就做完了. 令 \(dp[u][i]\) 表示单独考虑 \(u\) 节点所在子 ...

  4. Loj #3124. 「CTS2019 | CTSC2019」氪金手游

    Loj #3124. 「CTS2019 | CTSC2019」氪金手游 题目描述 小刘同学是一个喜欢氪金手游的男孩子. 他最近迷上了一个新游戏,游戏的内容就是不断地抽卡.现在已知: - 卡池里总共有 ...

  5. 「CTS2019 | CTSC2019」氪金手游 解题报告

    「CTS2019 | CTSC2019」氪金手游 降 智 好 题 ... 考场上签到失败了,没想容斥就只打了20分暴力... 考虑一个事情,你抽中一个度为0的点,相当于把这个点删掉了(当然你也只能抽中 ...

  6. 「CTS2019 | CTSC2019」随机立方体 解题报告

    「CTS2019 | CTSC2019」随机立方体 据说这是签到题,但是我计数学的实在有点差,这里认真说一说. 我们先考虑一些事实 如果我们在位置\((x_0,y_0,z_0)\)钦定了一个极大数\( ...

  7. 「译」JUnit 5 系列:条件测试

    原文地址:http://blog.codefx.org/libraries/junit-5-conditions/ 原文日期:08, May, 2016 译文首发:Linesh 的博客:「译」JUni ...

  8. 「译」JUnit 5 系列:扩展模型(Extension Model)

    原文地址:http://blog.codefx.org/design/architecture/junit-5-extension-model/ 原文日期:11, Apr, 2016 译文首发:Lin ...

  9. JavaScript OOP 之「创建对象」

    工厂模式 工厂模式是软件工程领域一种广为人知的设计模式,这种模式抽象了创建具体对象的过程.工厂模式虽然解决了创建多个相似对象的问题,但却没有解决对象识别的问题. function createPers ...

随机推荐

  1. ImageView.ScaleType

    前言 对ImageView.ScaleType,学习安卓需掌握.以官方链接:http://android.xsoftlab.net/reference/android/widget/ImageView ...

  2. intellij ide 激活(转发)

    前期准备 文件下载:jetbrains-agent.jar 激活码:license.txt 3AGXEJXFK9-eyJsaWNlbnNlSWQiOiIzQUdYRUpYRks5IiwibGljZW5 ...

  3. SpringBoot定时任务@Scheduled

    SpringBoot定时任务主要由两个注解完成. @Scheduled加在方法上面. @EnableScheduling加在类上面.可以是Application类,也可以是@Component类,还可 ...

  4. CTF SQL注入

    目录 一.宽字节注入 二.基于约束的注入 三.报错注入 四.时间盲注 五.bool盲注 六.order by的注入 六.INSERT.UPDATE.DELETE相关的注入 七.堆叠注入 八.常用绕过 ...

  5. linux hexdump使用

    # hexdump -h hexdump: invalid option -- 'h' Usage: hexdump [options] file... Options: -b one-byte oc ...

  6. Git push origin dev-rgq-istokenstatus 【dev-rgq-istokenstatus -> dev-rgq-istokenstatus】

    RenGuoQiang@PC-RENGUOQIANG MINGW64 /d/zgg/zgg-crm (dev-rgq-istokenstatus) $ git push origin dev-rgq- ...

  7. SQLite添加新的字段

    通过alter添加新的字段SQL语句 "ALTER TABLE 'DiHKChatMessage' ADD 'phoneNum' varchar"; 但是如果这个字段已经存在的话, ...

  8. SpringBoot入门-概念(一)

    SpringBoot是什么 Spring boot是一个构建在Spring框架之上.以一种更加简单快捷的方式来配置和运行web应用程序的开源框架. 为什么用SpringBoot 可以解决普通的java ...

  9. 【翻译】Flink Table Api & SQL — Hive Beta

    本文翻译自官网:Hive Beta https://ci.apache.org/projects/flink/flink-docs-release-1.9/dev/table/hive/ Flink ...

  10. windows下根据tcp端口查询对应的进程id(端口被占用)

    如下: 查询监听LISTENING的端口1027 netstat -navo|find /i "listen"|find /i ":1027" 结果如下(最后一 ...