LGP5075【JSOI2012】分零食

、

题解:
- 令$F$为欢乐度$f(x) = Ox^2 + Sx + U$的生成函数,常数项为$0$;
- 令$G(x) = \sum_{i=0}^{A} F^i (x) $
- $ans = [x^M]G;$
- 模数比较麻烦所以我用的分治求:
- 如果现在要求$0$到$n-1$的$G_{n} = \sum_{i=0}^{n-1}F^{i}$和$F_{n} = F^{n} $,假设n为偶数;
- 那么分治求出关于$n/2$的答案$G_{\frac{n}{2}}$和$F_{\frac{n}{2}}$
- $$G_{n} = (F_{\frac{n}{2}}+1)G_{\frac{n}{2}} , F_{n} = F_{\frac{n}{2}}^2$$
- 如果$n$是奇数先算用上述操作算$n-1$,再把$F_{n-1}$补加给$G_{n-1}$得到$G_{n}$,最后$F_{n-1}$另外乘一次得到$F_{n}$;
- 和快速幂的思想差不多;
#include<bits/stdc++.h>
#define ld double
using namespace std;
const int N=;
const ld pi=acos(-);
int M,P,A,O,S,U,len,L,rev[N];
struct C{
ld x,y;
C(ld _x=,ld _y=):x(_x),y(_y){};
C operator +(const C&A)const{return C(x+A.x,y+A.y);}
C operator -(const C&A)const{return C(x-A.x,y-A.y);}
C operator *(const C&A)const{return C(x*A.x-y*A.y,x*A.y+y*A.x);}
C operator /(const ld&A)const{return C(x/A,y/A);}
}f[N],g[N],t[N];
int cal(int x){return (O*x*x+S*x+U)%P;}
void fft(C*a,int f){
for(int i=;i<len;++i)if(i<rev[i])swap(a[i],a[rev[i]]);
for(int i=;i<len;i<<=){
C wn=C(cos(pi/i),f*sin(pi/i));
for(int j=;j<len;j+=i<<){
C w=C(,);
for(int k=;k<i;++k,w=w*wn){
C x=a[j+k],y=w*a[j+k+i];
a[j+k]=x+y,a[j+k+i]=x-y;
}
}
}
if(!~f)for(int i=;i<len;++i){
a[i]=a[i]/len;
a[i].x=int(a[i].x+0.1)%P;
a[i].y=;
}
}
void solve(int A){
if(A==){g[].x=;return;}
solve(A>>);
fft(f,);fft(g,);
for(int j=;j<len;++j)g[j]=g[j]*(f[j]+C(,)),f[j]=f[j]*f[j];
fft(f,-);fft(g,-);
for(int j=M+;j<len;++j)f[j].x=g[j].x=;
if(A&){
for(int j=;j<=M;++j)g[j].x=(int)(g[j].x+f[j].x+0.1)%P;
fft(f,);for(int j=;j<len;++j)f[j]=f[j]*t[j];
fft(f,-);for(int j=M+;j<len;++j)f[j].x=;
}
}
int main(){
// freopen("P5075.in","r",stdin);
// freopen("P5075.out","w",stdout);
scanf("%d%d%d%d%d%d",&M,&P,&A,&O,&S,&U);
for(int i=;i<=M;++i)t[i].x=f[i].x=cal(i%P);
for(len=;len<=M<<;len<<=,L++);
for(int i=;i<len;++i)rev[i]=(rev[i>>]>>)|((i&)<<(L-));
fft(t,);solve(min(A,M)+);
printf("%d\n",(int)(g[M].x+0.1)%P);
return ;
}
LGP5075【JSOI2012】分零食的更多相关文章
- 【BZOJ 4332】 4332: JSOI2012 分零食 (FFT+快速幂)
4332: JSOI2012 分零食 Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 119 Solved: 66 Description 这里是欢乐 ...
- [BZOJ 4332] [JSOI2012]分零食(DP+FFT)
[BZOJ 4332] [JSOI2012]分零食(DP+FFT) 题面 同学们依次排成了一列,其中有A位小朋友,有三个共同的欢乐系数O,S和U.如果有一位小朋友得到了x个糖果,那么她的欢乐程度就是\ ...
- bzoj4332;vijos1955:JSOI2012 分零食
描述 这里是欢乐的进香河,这里是欢乐的幼儿园. 今天是2月14日,星期二.在这个特殊的日子里,老师带着同学们欢乐地跳着,笑着.校长从幼儿园旁边的小吃店买了大量的零食决定分给同学们.听到这个消息,所有同 ...
- bzoj 4332:JSOI2012 分零食
描述 这里是欢乐的进香河,这里是欢乐的幼儿园. 今天是2月14日,星期二.在这个特殊的日子里,老师带着同学们欢乐地跳着,笑着.校长从幼儿园旁边的小吃店买了大量的零食决定分给同学们.听到这个消息,所有同 ...
- bzoj 4332: JSOI2012 分零食 快速傅立叶变换
题目: Description 同学们依次排成了一列,其中有A位小朋友,有三个共同的欢乐系数O,S和U.如果有一位小朋友得到了x个糖果,那么她的欢乐程度就是\(f(x)=O*x^2+S*x+U\) 现 ...
- 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存 ...
- [洛谷P5075][JSOI2012]分零食
题目大意:有$m(m\leqslant10^8)$个人站成一排,有$n(n\leqslant10^4)$个糖果,若第$i$个人没有糖果,那么第$i+1$个人也没有糖果.一个人有$x$个糖果会获得快乐值 ...
- BZOJ 4332: JSOI2012 分零食 FFT+分治
好题好题~ #include <bits/stdc++.h> #define N 50020 #define ll long long #define setIO(s) freopen(s ...
随机推荐
- AtCoder | ARC102 | 瞎讲报告
目录 ARC102 前言 正文 传送链接~ ARC102 前言 实在是太菜了....写完第一题就弃疗..感觉T3好歹也是道可做题吧!!然后T2怎么又是进制拆分! 正文 A 题意 给你两个数字\(n,k ...
- 占位符golang
定义示例类型和变量 type Human struct { Name string } var people = Human{Name:"zhangsan"} 普通占位符 占位符 ...
- Linux 做网关
首先创建两张路由表,只需要添加到相应的文件中即可,Linux一共支持255个路由表,rt_tables文件中默认已经存在了三张路由表,分别是: 255 local 254 main 2 ...
- Python参数传递,既不是传值也不是传引用
面试的时候,有没有被问到Python传参是传引用还是传值这种问题?有没有听到过Python传参既不是传值也不是传引用这种说法?一个小小的参数默认值也可能让代码出现难以查找的bug? 如果你也遇到过上面 ...
- java内存结构JVM——java内存模型JMM——java对象模型JOM
JVM内存结构 Java代码是要运行在虚拟机上的,而虚拟机在执行Java程序的过程中会把所管理的内存划分为若干个不同的数据区域,这些区域都有各自的用途.其中有些区域随着虚拟机进程的启动而存在,而有些区 ...
- 软件工程第十周psp
1.PSP表格 2.进度条 3.饼状图 4.折线图
- Notes of Daily Scrum Meeting(11.6 and 11.7)
Notes of Daily Scrum Meeting(11.6 and 11.7) 因为七号星期五是放假的第一天,好几名队员要么是出去玩,要么是回家了,所以我们讨论之后在七号没有开始代码的编写, ...
- Week-4-作业1
前言 经过了上周作业的学习拾遗,让我学到了很多东西,也能更好的阅读<构建之法>这本书,下面是我在阅读过第四章和第十七章之后想到的一些问题. 第四章 4.2.1 关于缩进,书中说用四个空格刚 ...
- cobbler技术详解(是PXE二次详解)
Cobbler是PXE的二次封装,使用Python语言开发, 可以用来快速建立 Linux 网络安装环境,它已将 Linux 网络安装的技术门槛,从大专以上文化水平,成功降低到初中以下,连补鞋匠都能学 ...
- 如何获取app的activity
(一) 本机安装appium的环境后,在cmd中输入:adb logcat>D:/log.log (二)真题连接电脑或在虚拟机中启动被测试app (三)直接查看d盘的log.log即可从来里面找 ...