【bzoj4332】【JSOI2012】 分零食 生成函数 FFT
我们构造$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的更多相关文章
- [BZOJ 4332] [JSOI2012]分零食(DP+FFT)
[BZOJ 4332] [JSOI2012]分零食(DP+FFT) 题面 同学们依次排成了一列,其中有A位小朋友,有三个共同的欢乐系数O,S和U.如果有一位小朋友得到了x个糖果,那么她的欢乐程度就是\ ...
- 【BZOJ 4332】 4332: JSOI2012 分零食 (FFT+快速幂)
4332: JSOI2012 分零食 Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 119 Solved: 66 Description 这里是欢乐 ...
- bzoj千题计划309:bzoj4332: JSOI2012 分零食(分治+FFT)
https://www.lydsy.com/JudgeOnline/problem.php?id=4332 因为如果一位小朋友得不到糖果,那么在她身后的小朋友们也都得不到糖果. 所以设g[i][j] ...
- BZOJ4332 JSOI2012 分零食 【倍增 + NTT】
题目链接 权限题BZOJ4332 题解 容易想到\(dp\) 设\(g[i][j]\)表示前\(i\)人分到\(j\)颗糖的所有方案的乘积之和 设\(f(x) = Ox^2 + Sx + U\) \[ ...
- bzoj4332[JSOI2012]分零食
一下午被这题的精度续掉了...首先可以找出一个多项式的等比数列的形式,然后类似poj的Matrix Series,不断倍增就可以了.用复数点值表示进行多次的多项式运算会刷刷地炸精度...应当用int存 ...
- bzoj4332;vijos1955:JSOI2012 分零食
描述 这里是欢乐的进香河,这里是欢乐的幼儿园. 今天是2月14日,星期二.在这个特殊的日子里,老师带着同学们欢乐地跳着,笑着.校长从幼儿园旁边的小吃店买了大量的零食决定分给同学们.听到这个消息,所有同 ...
- BZOJ 4332: JSOI2012 分零食 FFT+分治
好题好题~ #include <bits/stdc++.h> #define N 50020 #define ll long long #define setIO(s) freopen(s ...
- bzoj 4332:JSOI2012 分零食
描述 这里是欢乐的进香河,这里是欢乐的幼儿园. 今天是2月14日,星期二.在这个特殊的日子里,老师带着同学们欢乐地跳着,笑着.校长从幼儿园旁边的小吃店买了大量的零食决定分给同学们.听到这个消息,所有同 ...
- bzoj 4332: JSOI2012 分零食 快速傅立叶变换
题目: Description 同学们依次排成了一列,其中有A位小朋友,有三个共同的欢乐系数O,S和U.如果有一位小朋友得到了x个糖果,那么她的欢乐程度就是\(f(x)=O*x^2+S*x+U\) 现 ...
随机推荐
- Caused by: java.lang.NoClassDefFoundError at com.jc.zm.ZmAlarmAction.analyDo(ZmAlarmAction.java:198)
ZmPlanDayAction objPlanDay = new ZmPlanDayAction(); objPlanDay.setDao(dao); objPlanDay.setServle ...
- ApplicationContextAware学习--存疑问题
先看下ApplicationContextAware的源码: package org.springframework.context; import org.springframework.b ...
- Django入门与实践-第18章:访问已登录用户(完结)
http://127.0.0.1:8000/boards/1/topics/1/ #boards/views.py @login_required def new_topic(request, pk) ...
- gj3 Python数据模型(魔法函数)
3.1 什么是魔法函数 类里面,实现某些特性的内置函数,类似 def __xx__(): 的形式. 不要自己定义XX,并不是和某个类挂钩的 class Company(object): def __i ...
- LA 4329 Ping pong (树状数组)
题意:从左到右给你n个不同的数值,让你找出三个数值满足中间的数值在两边的数值之间的个数. 析:题意还是比较好理解的,关键是怎么求数量,首先我们分解一下只有两种情况,一个是左边<中间<右边, ...
- HBase Thrift2 CPU过高问题分析
目录 目录 1 1. 现象描述 1 2. 问题定位 2 3. 解决方案 5 4. 相关代码 5 1. 现象描述 外界连接9090端口均超时,但telnet端口总是成功.使用top命令观察,发现单个线程 ...
- Tensorflow currently has no official prebuild for your CUDA, cuDNN combination.
INFO CUDA version: 10. ERROR cuDNN not found. See https://github.com/deepfakes/faceswap/blob/master/ ...
- jsPlumb学习笔记
这就是一个给元素画连接线的工具. <!DOCTYPE html> <html> <head> <title>jsPlumb</title> ...
- maven镜像
使用maven管理项目,下载依赖jar包的时候,经常会下载很慢,但是如果使用镜像的话,速度超级快~~只要在.m2/setting.xml文件中设置镜像就可以啦~ 本文来自https://yq.aliy ...
- Delphi for iOS开发指南(6):在iOS应用程序中使用ComboBox组件来从列表中选择某一项
http://blog.csdn.net/delphiteacher/article/details/8924110 Delphi for iOS开发指南(6):在iOS应用程序中使用ComboBox ...