我们构造$f(x)$的生成函数$G(x)$,那么显然$[x^k]G(x)=Ok^2+Sk+U$

那么显然,答案即为$\sum_{i=1}^{n} [x^m]G^i(x)$

我们构造答案的生成函数$F(x)=\sum_{i=1}^{n} G^i(x)$

根据等比数列求和公式,$F(x)=G(x)\dfrac{1-G^{A}(x)}{1-G(x)}$

如果去等比数列求和的话,你需要多项式快速幂+多项式求逆,时间复杂度显然是$O(m\ log\ m)$的。

然而这个模数并不是质数,所以这么搞不是很好搞。

我们可以用一个类似快速幂的方式,去算出$\sum_{i-1}^{2^k-1}G^i(x)$的值。

这么搞的时间复杂度显然是$O(m\ log\ m\ log\ A)$。

然后就没了

第一次自己推出生成函数的题美滋滋

 #include<bits/stdc++.h>
#define MOD 998244353
#define L long long
#define M 1<<15
#define G 3
using namespace std; L pow_mod(L x,L k){
L ans=;
while(k){
if(k&) ans=ans*x%MOD;
x=x*x%MOD; k>>=;
}
return ans;
}
void change(L a[],int n){
for(int i=,j=;i<n-;i++){
if(i<j) swap(a[i],a[j]);
int k=n>>;
while(j>=k) j-=k,k>>=;
j+=k;
}
}
void NTT(L a[],int n,int on){
change(a,n);
for(int h=;h<=n;h<<=){
L wn=pow_mod(G,(MOD-)/h);
for(int j=;j<n;j+=h){
L w=;
for(int k=j;k<j+(h>>);k++){
L u=a[k],t=w*a[k+(h>>)]%MOD;
a[k]=(u+t)%MOD;
a[k+(h>>)]=(u-t+MOD)%MOD;
w=w*wn%MOD;
}
}
}
if(on==-){
L inv=pow_mod(n,MOD-);
for(int i=;i<n;i++) a[i]=a[i]*inv%MOD;
reverse(a+,a+n);
}
}
L m,P,A,O,S,U;
L g[M]={},gsum[M]={},ans[M]={}; int main(){
cin>>m>>P>>A>>O>>S>>U;
for(L i=;i<=m;i++) g[i]=(O*i*i+S*i+U)%P;
int len=; while(len<=(m*)) len<<=;
gsum[]=;
A=min(A,m);
while(A){ if(A&){
NTT(ans,len,); NTT(g,len,);
for(int i=;i<len;i++) ans[i]=ans[i]*g[i]%MOD;
NTT(ans,len,-); NTT(g,len,-);
for(int i=;i<=m;i++)
ans[i]=(ans[i]+g[i]+gsum[i])%P;
for(int i=m+;i<len;i++) ans[i]=;
}
A>>=; g[]++;
NTT(g,len,); NTT(gsum,len,);
for(int i=;i<len;i++) gsum[i]=gsum[i]*g[i]%MOD;
NTT(g,len,-); NTT(gsum,len,-);
g[]--;
for(int i=;i<len;i++) if(i>m) gsum[i]=; else gsum[i]%=P; NTT(g,len,);
for(int i=;i<len;i++) g[i]=g[i]*g[i]%MOD;
NTT(g,len,-);
for(int i=;i<len;i++) if(i>m) g[i]=; else g[i]%=P;
}
cout<<ans[m]<<endl;
}

【bzoj4332】【JSOI2012】 分零食 生成函数 FFT的更多相关文章

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

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

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

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

  3. bzoj千题计划309:bzoj4332: JSOI2012 分零食(分治+FFT)

    https://www.lydsy.com/JudgeOnline/problem.php?id=4332 因为如果一位小朋友得不到糖果,那么在她身后的小朋友们也都得不到糖果. 所以设g[i][j] ...

  4. BZOJ4332 JSOI2012 分零食 【倍增 + NTT】

    题目链接 权限题BZOJ4332 题解 容易想到\(dp\) 设\(g[i][j]\)表示前\(i\)人分到\(j\)颗糖的所有方案的乘积之和 设\(f(x) = Ox^2 + Sx + U\) \[ ...

  5. bzoj4332[JSOI2012]分零食

    一下午被这题的精度续掉了...首先可以找出一个多项式的等比数列的形式,然后类似poj的Matrix Series,不断倍增就可以了.用复数点值表示进行多次的多项式运算会刷刷地炸精度...应当用int存 ...

  6. bzoj4332;vijos1955:JSOI2012 分零食

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

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

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

  8. bzoj 4332:JSOI2012 分零食

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

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

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

随机推荐

  1. Spring boot 默认静态资源路径与手动配置访问路径的方法

    这篇文章主要介绍了Spring boot 默认静态资源路径与手动配置访问路径的方法,非常不错,具有参考借鉴价值,需要的朋友可以参考下   在application.propertis中配置 ##端口号 ...

  2. 通过电机编码器AB相输出确定电机转向

    AB相输出相差90度,即当A相"正跳变"时如果B相是高电平那么是"正转",反之是"反转" 图片: 正转 反转 #include <Ti ...

  3. Event事件冒泡和事件捕获

    <!doctype html> <html lang="en"> <head> <meta charset="gb2312&qu ...

  4. 笔记本的Windows系统怎么设置有了外接鼠标后停用触摸板

    点击控制面板,切换小图标模式,找到鼠标,点击它,然后会弹出一个窗口,找到ELAN选项卡(一般有个红色图标,不过可能需要对应驱动才会有此选项卡),选中插入外置 USB 指向装置时禁用.点击确定保存配置即 ...

  5. (转) MVC身份验证及权限管理-2

    转自:http://www.cnblogs.com/ldp615/archive/2010/10/27/asp-net-mvc-forms-authentication-roles-authoriza ...

  6. (最小生成树 Prim) Highways --POJ --1751

    链接: http://poj.org/problem?id=1751 Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 1150 ...

  7. D3_book 11.3 force

    <!-- pie example --> <!DOCTYPE html> <meta charset="utf-8"> <style> ...

  8. spring mvc的例子

    现在主流的Web MVC框架除了Struts这个主力 外,其次就是Spring MVC了,因此这也是作为一名程序员需要掌握的主流框架,框架选择多了,应对多变的需求和业务时,可实行的方案自然就多了.不过 ...

  9. 四、创建覆盖网络--Flannel

      Flannel是 CoreOS 团队针对 Kubernetes 设计的一个覆盖网络(Overlay Network)工具,其目的在于帮助每一个使用 Kuberentes 的 CoreOS 主机拥有 ...

  10. Spring Boot 应用系列 3 -- Spring Boot 2 整合MyBatis和Druid,多数据源

    本文演示多数据源(MySQL+SQL Server)的配置,并且我引入了分页插件pagehelper. 1. 项目结构 (1)db.properties存储数据源和连接池配置. (2)两个数据源的ma ...