题目:

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)\)

#include <cmath>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
typedef long long ll;
inline void read(int &x){
x=0;char ch;bool flag = false;
while(ch=getchar(),ch<'!');if(ch == '-') ch=getchar(),flag = true;
while(x=10*x+ch-'0',ch=getchar(),ch>'!');if(flag) x=-x;
}
const int maxn = 41000;
const double pi = acos(-1);
int mod;
struct complex{
long double x,y;
complex(){x=y=0;}
complex(long double a,long double b){x=a;y=b;}
complex operator + (const complex &r){return complex(x+r.x,y+r.y);}
complex operator - (const complex &r){return complex(x-r.x,y-r.y);}
complex operator * (const complex &r){return complex(x*r.x-y*r.y,x*r.y+y*r.x);}
complex operator / (const long double &r){return complex(x/r,y/r);}
};
inline void FFT(complex *x,int n,int p){
for(int i=0,t=0;i<n;++i){
if(i > t) swap(x[i],x[t]);
for(int j=n>>1;(t^=j) < j;j>>=1);
}
for(int m=2;m<=n;m<<=1){
int k = m>>1;
complex wn(cos(p*2*pi/m),sin(p*2*pi/m));
for(int i=0;i<n;i+=m){
complex w(1,0),u;
for(int j=0;j<k;++j,w=w*wn){
u = x[i+j+k]*w;
x[i+j+k] = x[i+j] - u;
x[i+j] = x[i+j] + u;
}
}
}
if(p == -1 ) for(int i=0;i<n;++i) x[i] = x[i]/n;
}
complex ca[maxn],cb[maxn],cc[maxn];int len,m;
inline int mul(int *a,int *b,int *c){
for(int i=0;i<len;++i){
ca[i] = complex((long double)a[i],0);
cb[i] = complex((long double)b[i],0);
}
FFT(ca,len,1);FFT(cb,len,1);
for(int i=0;i<len;++i) cc[i] = ca[i]*cb[i];
FFT(cc,len,-1);
for(int i=0;i<=m;++i){
c[i] = ((int)floor(cc[i].x + 0.5)) % mod;
}
}
int f[maxn],g[maxn],arr[maxn],tmp[maxn];
inline void qpow(int k){
if(k == 1){
for(int i=0;i<=m;++i) f[i] = g[i] = arr[i];
return ;
}qpow(k>>1);
mul(f,g,tmp);mul(g,g,g);
for(int i=0;i<=m;++i){
f[i] += tmp[i];
if(f[i] >= mod) f[i] -= mod;
}
if(k&1){
mul(g,arr,g);
for(int i=0;i<=m;++i){
f[i] += g[i];
if(f[i] >= mod) f[i] -= mod;
}
}
}
int main(){
read(m);read(mod);
for(len = 1;(len) <= (m<<1);len<<=1);
int n,a,b,c;read(n);read(a);read(b);read(c);
a %= mod;b %= mod;c %= mod;
for(int i=1;i<=m;++i) arr[i] = ((a*i*i % mod) + (b*i % mod) + c) % mod;
qpow(n);printf("%d\n",f[m]);
getchar();getchar();
return 0;
}

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. Live Archive 训练题 2019/3/9

    7454 Parentheses A bracket is a punctuation mark, which is used in matched pairs, usually used withi ...

  2. Intense Heat(前缀和或尺取)

    The heat during the last few days has been really intense. Scientists from all over the Berland stud ...

  3. scrum立会报告+燃尽图(第二周第六次)

    此作业要求参见:https://edu.cnblogs.com/campus/nenu/2018fall/homework/2251 一.小组介绍 组名:杨老师粉丝群 组长:乔静玉 组员:吴奕瑶.公冶 ...

  4. 2018软工实践—Alpha冲刺(7)

    队名 火箭少男100 组长博客 林燊大哥 作业博客 Alpha 冲鸭鸭鸭鸭鸭鸭鸭! 成员冲刺阶段情况 林燊(组长) 过去两天完成了哪些任务 协调各成员之间的工作 学习MSI.CUDA 试运行软件并调试 ...

  5. Java 数组转字符

    public static String toString(int[] arr){ String temp = ""; for(int i = 0;i<arr.length; ...

  6. URL相关Web APIs

    参考文档:MDN> Web API接口 > URLUtils MDN > Web API接口 > URL MDN > Web API接口 > Location MD ...

  7. IE报错:SCRIPT1010: 缺少标识符

    原文 http://keenwon.com/989.html 昨天用IE11测试页面的时候,发现在文档模式调整到IE8的时候,会报错: 看了半天,百思不得其解,后来终于顿悟:delete是javasc ...

  8. 使用kdump内核调试工具遇到的问题及解决

    修改linux内核代码或者内核模块的时候,搞不好就会造成linux死机崩溃,crash死机后/var/log/kern.log里面不会有任何异常信息记录.这时候kdump就会派上用场了,网上kdump ...

  9. WPF和Expression Blend开发实例:模拟QQ登陆界面打开和关闭特效

    不管在消费者的心中腾讯是一个怎么样的模仿者抄袭者的形象,但是腾讯在软件交互上的设计一直是一流的.正如某位已故的知名产品经理所说的:设计并非外观怎样,感觉如何.设计的是产品的工作原理.我觉得腾讯掌握了其 ...

  10. p2 休眠模式

    如有错误,忘请指出. 才入手p2.p2有全局休眠模式,和钢体体眠模式.钢体能控制 body.allowSleep world.NO_SLEEPING 不允许休眠world.BODY_SLEEPING ...