题目大意:有$m(m\leqslant10^8)$个人站成一排,有$n(n\leqslant10^4)$个糖果,若第$i$个人没有糖果,那么第$i+1$个人也没有糖果。一个人有$x$个糖果会获得快乐值$v(x)$。

$$
v(x)=
\begin{cases}
ax^2+bx+c&(x>1)\\
1&(x=1)
\end{cases}
$$
一个方案的价值为$\prod\limits_{i=1}^mv(s_i)$($s_i$为第$i$个人得到的糖果数)。问所有方案的价值和,对$mod(mod\leqslant255)$取模

题解:令$f(x)=\sum\limits_{i=1}^{\infty}v(i)x^i$,那么$k$个人全部得到糖果的方案数是$[x^n]f^k(x)$。

$$
\begin{align*}
ans&=[x^n]\sum\limits_{i=1}^mf^i(x)\\
    &=[x^n]\sum\limits_{i=0}^mf^i(x)\\
    &=[x^n]\dfrac{1-f^{m+1}(x)}{1-f(x)}
\end{align*}
$$
注意这里的模数不是质数,但很小,可以用一模$NTT$,注意求逆部分,需要多把点值转成系数,因为负数无法表示。

卡点:$NTT$预处理部分度数没有加,调了一个上午。。。

C++ Code:

  1. #include <cstdio>
  2. #include <cstring>
  3. #include <algorithm>
  4. #define maxn 32768
  5. const int mod = 998244353;
  6. namespace Math {
  7. inline int pw(int base, int p) {
  8. static int res;
  9. for (res = 1; p; p >>= 1, base = static_cast<long long> (base) * base % mod) if (p & 1) res = static_cast<long long> (res) * base % mod;
  10. return res;
  11. }
  12. inline int inv(int x) { return pw(x, mod - 2); }
  13. }
  14. inline void reduce(int &x) { x += x >> 31 & mod; }
  15. inline void clear(register int *l, const int *r){
  16. if(l >= r) return ;
  17. while (l != r) *l++ = 0;
  18. }
  19.  
  20. int n, m, a, b, c, pmod;
  21. namespace Poly {
  22. #define N maxn
  23. int lim, s, rev[N];
  24. int Wn[N + 1];
  25. inline void init(const int n) {
  26. lim = 1, s = -1; while (lim < n) lim <<= 1, ++s;
  27. for (register int i = 1; i < lim; ++i) rev[i] = rev[i >> 1] >> 1 | (i & 1) << s;
  28. const int t = Math::pw(3, (mod - 1) / lim);
  29. *Wn = 1; for (register int *i = Wn; i != Wn + lim; ++i) *(i + 1) = static_cast<long long> (*i) * t % mod;
  30. }
  31. inline void NTT(int *A, const int op = 1) {
  32. for (register int i = 1; i < lim; ++i) if (i < rev[i]) std::swap(A[i], A[rev[i]]);
  33. for (register int mid = 1; mid < lim; mid <<= 1) {
  34. const int t = lim / mid >> 1;
  35. for (register int i = 0; i < lim; i += mid << 1)
  36. for (register int j = 0; j < mid; ++j) {
  37. const int X = A[i + j], Y = static_cast<long long> (A[i + j + mid]) * Wn[j * t] % mod;
  38. reduce(A[i + j] += Y - mod), reduce(A[i + j + mid] = X - Y);
  39. }
  40. }
  41. if (!op) {
  42. const int ilim = Math::inv(lim);
  43. for (register int *i = A; i != A + lim; ++i) *i = static_cast<long long> (*i) * ilim % mod;
  44. std::reverse(A + 1, A + lim);
  45. }
  46. }
  47.  
  48. inline void INV(int *A, int *B, int n) {
  49. if (n == 1) { *B = 1; return ; }
  50. static int C[N];
  51. const int len = n + 1 >> 1;
  52. INV(A, B, len);
  53. init(n + n - 1);
  54. std::copy(A, A + n, C), clear(C + n, C + lim);
  55. NTT(C), NTT(B);
  56. for (register int i = 0; i < lim; ++i) C[i] = static_cast<long long> (C[i]) * B[i] % mod;
  57. NTT(C, 0), clear(C + n, C + lim);
  58. for (int *i = C; i != C + n; ++i) *i = pmod - *i % pmod;
  59. C[0] += 2, NTT(C);
  60. for (int i = 0; i < lim; ++i) B[i] = static_cast<long long> (B[i]) * C[i] % mod;
  61. NTT(B, 0);
  62. for (int *i = B; i != B + n; ++i) *i %= pmod;
  63. clear(B + n, B + lim);
  64. }
  65. inline void PW(int *A, int *B, int n, int p) {
  66. static int C[N], D[N];
  67. std::copy(A, A + n, C);
  68. init(n + n - 1);
  69. B[0] = 1, clear(B + 1, B + lim);
  70. while (p) {
  71. if (p & 1) {
  72. std::copy(C, C + n, D), clear(D + n, D + lim);
  73. NTT(B), NTT(D);
  74. for (int i = 0; i < lim; ++i) B[i] = static_cast<long long> (B[i]) * D[i] % mod;
  75. NTT(B, 0), clear(B + n, B + lim);
  76. for (int *i = B; i != B + n; ++i) *i %= pmod;
  77. }
  78. if (p >>= 1) {
  79. NTT(C);
  80. for (int *i = C; i != C + lim; ++i) *i = static_cast<long long> (*i) * *i % mod;
  81. NTT(C, 0), clear(C + n, C + lim);
  82. for (int *i = C; i != C + n; ++i) *i %= pmod;
  83. }
  84. }
  85. }
  86. #undef N
  87. }
  88.  
  89. int f[maxn], A[maxn], B[maxn];
  90. int main() {
  91. scanf("%d%d", &n, &pmod); ++n;
  92. scanf("%d%d%d%d", &m, &a, &b, &c);
  93. m = std::min(m, n - 1);
  94. for (int i = 1; i < n; ++i) f[i] = (i * i % pmod * a + i * b + c) % pmod;
  95.  
  96. Poly::PW(f, A, n, m + 1);
  97. for (int *i = A; i != A + n; ++i) *i = pmod - *i; ++*A;
  98. for (int *i = f; i != f + n; ++i) *i = pmod - *i; ++*f;
  99. Poly::INV(f, B, n);
  100.  
  101. Poly::init(n + n - 1);
  102. Poly::NTT(A), Poly::NTT(B);
  103. for (int i = Poly::lim; ~i; --i) A[i] = static_cast<long long> (A[i]) * B[i] % mod;
  104. Poly::NTT(A, 0);
  105.  
  106. printf("%d\n", A[n - 1] % pmod);
  107. return 0;
  108. }

[洛谷P5075][JSOI2012]分零食的更多相关文章

  1. 【BZOJ 4332】 4332: JSOI2012 分零食 (FFT+快速幂)

    4332: JSOI2012 分零食 Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 119  Solved: 66 Description 这里是欢乐 ...

  2. [BZOJ 4332] [JSOI2012]分零食(DP+FFT)

    [BZOJ 4332] [JSOI2012]分零食(DP+FFT) 题面 同学们依次排成了一列,其中有A位小朋友,有三个共同的欢乐系数O,S和U.如果有一位小朋友得到了x个糖果,那么她的欢乐程度就是\ ...

  3. 洛谷 P5233 - [JSOI2012]爱之项链(Polya 定理+递推)

    洛谷题面传送门 首先很明显题目暗示我们先求出符合条件的戒指数量,再计算出由这些戒指能够构成的项链的个数,因此考虑分别计算它们.首先是计算符合条件的戒指数量,题目中"可以通过旋转重合的戒指视作 ...

  4. bzoj4332;vijos1955:JSOI2012 分零食

    描述 这里是欢乐的进香河,这里是欢乐的幼儿园. 今天是2月14日,星期二.在这个特殊的日子里,老师带着同学们欢乐地跳着,笑着.校长从幼儿园旁边的小吃店买了大量的零食决定分给同学们.听到这个消息,所有同 ...

  5. bzoj 4332:JSOI2012 分零食

    描述 这里是欢乐的进香河,这里是欢乐的幼儿园. 今天是2月14日,星期二.在这个特殊的日子里,老师带着同学们欢乐地跳着,笑着.校长从幼儿园旁边的小吃店买了大量的零食决定分给同学们.听到这个消息,所有同 ...

  6. 洛谷P1154 奶牛分厩

    P1154 奶牛分厩 173通过 481提交 题目提供者该用户不存在 标签高性能 难度普及- 时空限制1s / 128MB 提交  讨论  题解 最新讨论更多讨论 测试点3??? 求助!超时了 我抗议 ...

  7. bzoj 4332: JSOI2012 分零食 快速傅立叶变换

    题目: Description 同学们依次排成了一列,其中有A位小朋友,有三个共同的欢乐系数O,S和U.如果有一位小朋友得到了x个糖果,那么她的欢乐程度就是\(f(x)=O*x^2+S*x+U\) 现 ...

  8. 洛谷——P1154 奶牛分厩

    P1154 奶牛分厩 题目描述 农夫约翰有N(1<=N<=5000)头奶牛,每头奶牛都有一个唯一的不同于其它奶牛的编号Si,所有的奶牛都睡在一个有K个厩的谷仓中,厩的编号为0到K-1.每头 ...

  9. 洛谷 P2858 [USACO06FEB]奶牛零食Treats for the Cows

    题目描述 FJ has purchased N (1 <= N <= 2000) yummy treats for the cows who get money for giving va ...

随机推荐

  1. dvs-panotracking编译运行

    编译运行dvs-panotracking > 编译dvs-panotracking之前首先需要安装imageutilities . 源码下载 https://github.com/VLOGrou ...

  2. springboot与activemq的使用

    1.springboot和activemq的使用相对来说比较方便了,我在网上看了很多其他的资料,但是自己写出来总是有点问题所以,这里重点描述一下遇到的一些问题. 2.至于activemq的搭建和spr ...

  3. ORA-15032、ORA-15033—Linux环境

    SQL> alter diskgroup DATA add failgroup DATA_0000 disk '/dev/raw/raw12'; alter diskgroup DATA add ...

  4. jmeter开发自己的sampler插件

    1. 新建maven工程 2.pom文件引入jmeter的核心包 <project xmlns="http://maven.apache.org/POM/4.0.0" xml ...

  5. 接口测试工具postman(八)上传文件接口

    涉及到选择文件的接口,在[Body]页签下,key选择File选项,会显示“选择文件”按钮,选择本地的文件

  6. 腾讯云API弹性公网IP踩坑

    由于自己管理的云服务器数量比较多,时不时需要更换IP,在管理台上一下下点击,实在浪费时间,于是就想到了通过API调用的方式,将更换IP一系列动作,全部集成到Python代码里面,实现一行命令,完成IP ...

  7. selenide 自动化测试进阶一: 查找元素和相关操作

    基础环境配置和举例请移步:https://www.cnblogs.com/davice/p/9298742.html 提到自动化有些测试同学就会问,我会使用工具录制做自动化,我会用工具或插件识别元素. ...

  8. 学好三角学(函数) — SWIFT和JAVASCRIPT游戏开发的必备技能 iFIERO.com

    不论是使用哪种平台进行开发,三角学在游戏当中都被广泛的使用,因此,小编iFERO认为,三角学是必须得掌握的技能之一. 游戏图片由 摘自 Razeware LLC 先以Javascript为例 一.角度 ...

  9. lintcode204 单例

    单例   单例 是最为最常见的设计模式之一.对于任何时刻,如果某个类只存在且最多存在一个具体的实例,那么我们称这种设计模式为单例.例如,对于 class Mouse (不是动物的mouse哦),我们应 ...

  10. C++ ifndef /define/ endif 作用和用法

    ifndef/define/endif”主要目的是防止头文件的重复包含和编译 比如你有两个C文件,这两个C文件都include了同一个头文件.而编译时,这两个C文件要一同编译成一个可运行文件,于是问题 ...