题目:

Description

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

现在校长开始分糖果了,一共有M个糖果。有些小朋友可能得不到糖果,对于那些得不到糖果的小朋友来说,欢乐程度就是1。如果一位小朋友得不到糖果,那么在她身后的小朋友们也都得不到糖果。(即这一列得不到糖果的小朋友一定是最后的连续若干位)

所有分糖果的方案都是等概率的。现在问题是:期望情况下,所有小朋友的欢乐程度的乘积是多少?呆呆同学很快就有了一个思路,只要知道总的方案个数T和所有方案下欢乐程度乘积的总和S,就可以得到答案Ans=S/T。现在他已经求出来了T的答案,但是S怎么求呢?他就不知道了。你能告诉他么?

因为答案很大,你只需要告诉他S对P取模后的结果。

题解:

首先这道题我们可以考虑枚举一下有多少人得到了零食

设\(g[i][j]\)表示\(i\)个人里分下去了\(j\)个零食得到的值,n为人数,m为零食数

这样我们有\(ans = \sum_{i=1}^ng[i][m]\)

\(g[i][j]\)的递推我们有

\[g[i][j] = \sum_{k=1}^{j-1}g[i-1][j-k]*F(k)
\]

其中\(F(k)\)表示将\(k\)个零食分给一个人得到的权

然后我们惊奇地发现后面的式子是一个卷积的形式

所以我们可以得到\(g_i = g_{i-1}*F\)

由于卷积满足结合律,所以我们有\(g_i = g_0*F^i\)

这样的话我们能够完成\(nlogn\)的单点求值,但是我们要求的是\(g_i\)的一个和

我们把答案\(ans\)拓展为一个多项式\(f(x)\),答案储存在第f(n)的第\(m\)位

则有\(f_n = \sum_{i=1}^{n}g_i\)

然后我们发现:

\[f_n = f_{\frac{n}{2}} + \sum_{i=\frac{n}{2}+1}^{n}g_i
\]

\[f_n = f_{\frac{n}{2}} + \sum_{i=1}^{\frac{n}{2}}g_{\frac{n}{2}+i}
\]

在继续推导之前首先我们需要证明: \(g_{i+j} = g_i*g_j\)

由\(g_i = g_0*F^i\)可得:\(g_i*g_j = g_0*g_0*F^i*F^j\)

因为:\(g_0*g_0 = g_0\)所以有\(g_0*g_0*F^i*F^j = g_0*F^i*F^j = g_{i+j}\)得证

所以继续上式的推导我们有

\[f_n = f_{\frac{n}{2}} + \sum_{i=1}^{\frac{n}{2}}g_{\frac{n}{2}}*g_i
\]

我们将卷积的形式再拆解开来:

\[f_n = f_{\frac{n}{2}} + \sum_{i=1}^{\frac{n}{2}}\sum_{j=1}^{m-1}g_{\frac{n}{2},m-j}*g_{i,j}
\]

\[f_n = f_{\frac{n}{2}} + \sum_{j=1}^{m-1}g_{\frac{n}{2},m-j}*\sum_{i=1}^{\frac{n}{2}}g_{i,j}
\]

\[f_n = f_{\frac{n}{2}} + \sum_{j=1}^{m-1}g_{\frac{n}{2},m-j}*f_{\frac{n}{2},j}
\]

\[f_n = f_{\frac{n}{2}} + g_{\frac{n}{2}}*f_{\frac{n}{2}}
\]

我们又知道:

\[g_n = g_{\frac{n}{2}}*g_{\frac{n}{2}}
\]

所以迭代倍增即可求解

复杂度\(O(nlog^2n)\)

  1. #include <cmath>
  2. #include <cstdio>
  3. #include <cstring>
  4. #include <algorithm>
  5. using namespace std;
  6. typedef long long ll;
  7. inline void read(int &x){
  8. x=0;char ch;bool flag = false;
  9. while(ch=getchar(),ch<'!');if(ch == '-') ch=getchar(),flag = true;
  10. while(x=10*x+ch-'0',ch=getchar(),ch>'!');if(flag) x=-x;
  11. }
  12. const int maxn = 41000;
  13. const double pi = acos(-1);
  14. int mod;
  15. struct complex{
  16. long double x,y;
  17. complex(){x=y=0;}
  18. complex(long double a,long double b){x=a;y=b;}
  19. complex operator + (const complex &r){return complex(x+r.x,y+r.y);}
  20. complex operator - (const complex &r){return complex(x-r.x,y-r.y);}
  21. complex operator * (const complex &r){return complex(x*r.x-y*r.y,x*r.y+y*r.x);}
  22. complex operator / (const long double &r){return complex(x/r,y/r);}
  23. };
  24. inline void FFT(complex *x,int n,int p){
  25. for(int i=0,t=0;i<n;++i){
  26. if(i > t) swap(x[i],x[t]);
  27. for(int j=n>>1;(t^=j) < j;j>>=1);
  28. }
  29. for(int m=2;m<=n;m<<=1){
  30. int k = m>>1;
  31. complex wn(cos(p*2*pi/m),sin(p*2*pi/m));
  32. for(int i=0;i<n;i+=m){
  33. complex w(1,0),u;
  34. for(int j=0;j<k;++j,w=w*wn){
  35. u = x[i+j+k]*w;
  36. x[i+j+k] = x[i+j] - u;
  37. x[i+j] = x[i+j] + u;
  38. }
  39. }
  40. }
  41. if(p == -1 ) for(int i=0;i<n;++i) x[i] = x[i]/n;
  42. }
  43. complex ca[maxn],cb[maxn],cc[maxn];int len,m;
  44. inline int mul(int *a,int *b,int *c){
  45. for(int i=0;i<len;++i){
  46. ca[i] = complex((long double)a[i],0);
  47. cb[i] = complex((long double)b[i],0);
  48. }
  49. FFT(ca,len,1);FFT(cb,len,1);
  50. for(int i=0;i<len;++i) cc[i] = ca[i]*cb[i];
  51. FFT(cc,len,-1);
  52. for(int i=0;i<=m;++i){
  53. c[i] = ((int)floor(cc[i].x + 0.5)) % mod;
  54. }
  55. }
  56. int f[maxn],g[maxn],arr[maxn],tmp[maxn];
  57. inline void qpow(int k){
  58. if(k == 1){
  59. for(int i=0;i<=m;++i) f[i] = g[i] = arr[i];
  60. return ;
  61. }qpow(k>>1);
  62. mul(f,g,tmp);mul(g,g,g);
  63. for(int i=0;i<=m;++i){
  64. f[i] += tmp[i];
  65. if(f[i] >= mod) f[i] -= mod;
  66. }
  67. if(k&1){
  68. mul(g,arr,g);
  69. for(int i=0;i<=m;++i){
  70. f[i] += g[i];
  71. if(f[i] >= mod) f[i] -= mod;
  72. }
  73. }
  74. }
  75. int main(){
  76. read(m);read(mod);
  77. for(len = 1;(len) <= (m<<1);len<<=1);
  78. int n,a,b,c;read(n);read(a);read(b);read(c);
  79. a %= mod;b %= mod;c %= mod;
  80. for(int i=1;i<=m;++i) arr[i] = ((a*i*i % mod) + (b*i % mod) + c) % mod;
  81. qpow(n);printf("%d\n",f[m]);
  82. getchar();getchar();
  83. return 0;
  84. }

bzoj 4332: JSOI2012 分零食 快速傅立叶变换的更多相关文章

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

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

  2. BZOJ 4332: JSOI2012 分零食 FFT+分治

    好题好题~ #include <bits/stdc++.h> #define N 50020 #define ll long long #define setIO(s) freopen(s ...

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

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

  4. BZOJ 2194 快速傅立叶变换之二 | FFT

    BZOJ 2194 快速傅立叶变换之二 题意 给出两个长为\(n\)的数组\(a\)和\(b\),\(c_k = \sum_{i = k}^{n - 1} a[i] * b[i - k]\). 题解 ...

  5. 为什么要进行傅立叶变换?傅立叶变换究竟有何意义?如何用Matlab实现快速傅立叶变换

    写在最前面:本文是我阅读了多篇相关文章后对它们进行分析重组整合而得,绝大部分内容非我所原创.在此向多位原创作者致敬!!!一.傅立叶变换的由来关于傅立叶变换,无论是书本还是在网上可以很容易找到关于傅立叶 ...

  6. 离散傅立叶变换与快速傅立叶变换(DFT与FFT)

    自从去年下半年接触三维重构以来,听得最多的词就是傅立叶变换,后来了解到这个变换在图像处理里面也是重点中的重点. 本身自己基于高数知识的理解是傅立叶变换是将一个函数变为一堆正余弦函数的和的变换.而图像处 ...

  7. 快速傅立叶变换(FFT)算法

    已知多项式f(x)=a0+a1x+a2x2+...+am-1xm-1, g(x)=b0+b1x+b2x2+...+bn-1xn-1.利用卷积的蛮力算法,得到h(x)=f(x)g(x),这一过程的时间复 ...

  8. $\mathcal{FFT}$·$\mathcal{Fast \ \ Fourier \ \ Transformation}$快速傅立叶变换

    \(2019.2.18upd:\) \(LINK\) 之前写的比较适合未接触FFT的人阅读--但是有几个地方出了错,大家可以找一下233 啊-本来觉得这是个比较良心的算法没想到这么抽搐这个算法真是将一 ...

  9. 快速傅立叶变换(FFT)

    多项式 系数表示法 设\(f(x)\)为一个\(n-1\)次多项式,则 \(f(x)=\sum\limits_{i=0}^{n-1}a_i*x_i\) 其中\(a_i\)为\(f(x)\)的系数,用这 ...

随机推荐

  1. 【ZABBIX】ZABBIX3.2升级3.4

    小贴士 1.停止zabbix服务 service zabbix_server stop service zabbix_agentd stop /usr/local/zabbix/sbin/zabbix ...

  2. AI智能外呼机器人网络拓扑结构笔记

    最近开发了一套AI智能外呼机器人系统,系统主要有3部分组成:web管理平台:呼叫机器人:SIP软交换.具体网络拓扑结构如下图: 三部分主要功能如下: 1.web管理平台:话术管理.任务管理.线路管理. ...

  3. 53. [LeetCode] Maximum Subarray

    Given an integer array nums, find the contiguous subarray (containing at least one number) which has ...

  4. jpa的@Query中"?"占位符的使用小坑

    今天使用@Query自定义查询语句,出现了一个错误: java.lang.IllegalArgumentException: Parameter with that position [1] did ...

  5. 梯度下降算法以及其Python实现

    一.梯度下降算法理论知识 我们给出一组房子面积,卧室数目以及对应房价数据,如何从数据中找到房价y与面积x1和卧室数目x2的关系?   为了实现监督学习,我们选择采用自变量x1.x2的线性函数来评估因变 ...

  6. 《JavaScript设计模式与开发实践》——第3章 闭包和高阶函数

    闭包 变量的作用域和生存周期密切相关 高阶函数 函数可以作为参数被传递 函数可以作为返回值输出

  7. Ubuntu16.04下安装显卡驱动记录

    安装环境及硬件信息 Ubuntu16.04 LTS 内核版本:4.4.0 显卡:Nvidia GeForce GTX 1060 安装过程 一.首先要下载好显卡驱动程序,官方网址:http://www. ...

  8. 第四周作业——C语言自评

    1.你对自己的未来有什么规划?做了哪些准备?以目前的现状来说,希望至少能够掌握专业所要求的基本操作,然后一步步去深入.提升,毕业之后不会灰溜溜的一次次求职失败.目前更多的是利用闲暇时间补回过去老师同学 ...

  9. 【week8】psp~~进度条

    本周psp 项目 内容 开始时间 结束时间 中断时间 净时间 10月7日 星期一 论文 看生物信息方面的论文 10:00 12:00 5 115 写代码 注册信息从前台传入servlet 18:00 ...

  10. 第142天:Size Marks下载安装和使用方法

    Size Marks下载安装使用方法 一.下载安装 1.下载Size marks:链接: https://pan.baidu.com/s/1breyMf1 密码: fjsn 2. 复制 Size Ma ...