bzoj千题计划309:bzoj4332: JSOI2012 分零食(分治+FFT)
https://www.lydsy.com/JudgeOnline/problem.php?id=4332
因为如果一位小朋友得不到糖果,那么在她身后的小朋友们也都得不到糖果。
所以设g[i][j] 表示前i位小朋友,分到j个糖果,且前i位小朋友都分到糖果的方案数
令F(x) 表示分到x个糖果的欢乐程度
∴g[i][j] = ∑ g[i-1][j-k]*F(k)
记g[i]=g[i-1]*F,则 g[i]=F ^ i
但是要求的是 Σ g[i][m]
记f[n]=Σ g[i] i∈[1,n] ,那么ans=f[n][m]
f[n]=Σ g[i] i∈[1,n]
=Σ f(n/2)+Σ g[i] i∈[n/2+1,n]
=Σ f(n/2)+Σ F^i i∈[n/2+1,n]
=Σ f(n/2)+Σ F^(n/2+i) i∈[1,n/2]
=Σ f(n/2)+F^(n/2) * Σ F^i i∈[1,n/2]
=Σ f(n/2)+g(n/2)*f(n/2)
然后可以分治解决
如果n是奇数,f(n)=f(n-1)+g[n]=f(n-1)+g(n-1)*f
边界条件:g[][0]=1
#include<cmath>
#include<cstdio>
#include<algorithm> using namespace std; const int M=<<; #define N 10001 int m,mod; int r[M+];
int len; const double pi=acos(-); struct Complex
{
double x,y;
Complex() { }
Complex(double x_,double y_):x(x_),y(y_) { }
Complex operator + (Complex p)
{
Complex C;
C.x=x+p.x;
C.y=y+p.y;
return C;
}
Complex operator - (Complex p)
{
Complex C;
C.x=x-p.x;
C.y=y-p.y;
return C;
}
Complex operator * (Complex p)
{
Complex C;
C.x=x*p.x-y*p.y;
C.y=x*p.y+y*p.x;
return C;
}
void clear()
{
x=y=;
}
}; typedef Complex E; E F[M+],f[M+],g[M+],tmp[M+]; void FFT(E *a,int ty)
{
for(int i=;i<len;++i)
if(i<r[i]) swap(a[i],a[r[i]]);
for(int i=;i<len;i<<=)
{
E wn(cos(pi/i),ty*sin(pi/i));
for(int p=i<<,j=;j<len;j+=p)
{
E w(,);
for(int k=;k<i;++k,w=w*wn)
{
E x=a[j+k],y=w*a[i+j+k];
a[j+k]=x+y; a[i+j+k]=x-y;
}
}
}
if(ty==-)
{
for(int i=;i<len;++i) a[i].x=a[i].x/len,a[i].x=int(a[i].x+0.5)%mod,a[i].y=;
}
} void solve(E *f,E *g,int n)
{
if(!n)
{
g[].x=;
return;
}
if(n&)
{
solve(f,g,n-);
FFT(g,);
for(int i=;i<len;++i) g[i]=g[i]*F[i];
FFT(g,-);
for(int i=;i<=m;++i) f[i]=f[i]+g[i];
for(int i=;i<=m;++i) f[i].x=int(f[i].x)%mod,f[i].y=;
for(int i=m+;i<len;++i) f[i].clear(),g[i].clear();
}
else
{
solve(f,g,n/);
for(int i=;i<len;++i) tmp[i]=f[i];
FFT(tmp,);
FFT(g,);
for(int i=;i<len;++i) tmp[i]=tmp[i]*g[i];
FFT(tmp,-);
for(int i=;i<len;++i) g[i]=g[i]*g[i];
FFT(g,-);
for(int i=;i<=m;++i) f[i]=f[i]+tmp[i];
for(int i=;i<=m;++i) f[i].x=int(f[i].x)%mod,f[i].y=;
for(int i=m+;i<len;++i) f[i].clear(),g[i].clear();
}
} int main()
{
int n,o,s,u;
scanf("%d%d%d%d%d%d",&m,&mod,&n,&o,&s,&u);
//F[0].x=1;
for(int i=;i<=m;++i) F[i].x=(o*i*i+s*i+u)%mod;
int l=;
for(len=;len<=m+m;len<<=,l++);
for(int i=;i<len;++i) r[i]=(r[i>>]>>)|((i&)<<l-);
FFT(F,);
solve(f,g,n);
printf("%d",int(f[m].x));
return ;
}
bzoj千题计划309: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千题计划300:bzoj4823: [Cqoi2017]老C的方块
http://www.lydsy.com/JudgeOnline/problem.php?id=4823 讨厌的形状就是四联通图 且左右各连一个方块 那么破坏所有满足条件的四联通就好了 按上图方式染色 ...
- bzoj千题计划273:bzoj4710: [Jsoi2011]分特产
http://www.lydsy.com/JudgeOnline/problem.php?id=4710 答案=总方案数-不合法方案数 f[i][j] 前i种特产分给j个人(可能有人没有分到特产)的总 ...
- bzoj千题计划196:bzoj4826: [Hnoi2017]影魔
http://www.lydsy.com/JudgeOnline/problem.php?id=4826 吐槽一下bzoj这道题的排版是真丑... 我还是粘洛谷的题面吧... 提供p1的攻击力:i,j ...
- bzoj千题计划317:bzoj4650: [Noi2016]优秀的拆分(后缀数组+差分)
https://www.lydsy.com/JudgeOnline/problem.php?id=4650 如果能够预处理出 suf[i] 以i结尾的形式为AA的子串个数 pre[i] 以i开头的形式 ...
- bzoj千题计划280:bzoj4592: [Shoi2015]脑洞治疗仪
http://www.lydsy.com/JudgeOnline/problem.php?id=4592 注意操作1 先挖再补,就是补的范围可以包含挖的范围 SHOI2015 的题 略水啊(逃) #i ...
- bzoj千题计划252:bzoj1095: [ZJOI2007]Hide 捉迷藏
http://www.lydsy.com/JudgeOnline/problem.php?id=1095 点分树+堆 请去看 http://www.cnblogs.com/TheRoadToTheGo ...
- bzoj千题计划251:bzoj3672: [Noi2014]购票
http://www.lydsy.com/JudgeOnline/problem.php?id=3672 法一:线段树维护可持久化单调队列维护凸包 斜率优化DP 设dp[i] 表示i号点到根节点的最少 ...
随机推荐
- MT【243】球内接四面体体积
已知半径为2的球面上有$A,B,C,D$四点,若$AB=CD=2$,则四面体$ABCD$的体积最大为____ 解答:利用$V=\dfrac{1}{6}|AB||CD|d<AB,CD>sin ...
- Shell 字符截取命令 Cut
1.Cut 命令 # cut [选项] 文件名 选项 : -f 列号 提取第几列 -d 分隔符,按照指定分隔符分割列 2.例子 cut -f 1,4 -d ":" /etc/p ...
- SCOI2016 Day2 简要题解
「SCOI2016」妖怪 题意 有 \(n\) 只妖怪,每只妖怪有攻击力 \(\text{atk}\) 和防御力 \(\text{dnf}\) ,在环境 \((a, b)\) 下,它可以把攻击力和防御 ...
- AXURE 8弄一个轮播图的步骤
这个图是网上找到,7.0可以使用. 如果是8.0.没有找到"动态面板"这个地方,如下图所示
- HDU--1540 Tunnel Warfare(线段树区间更新)
题目链接:1540 Tunnel Warfare 以为单组输入 这个题多组输入 结构体记录每个区间左边和右边的连续区间 ms记录最大 在查询操作时: 1.这个点即将查询到右区间 看这个点 x 是否存在 ...
- 记一次 HTTP信息头管理器使用 的重要性
今天在测试中遇到了一个问题 使用JMeter时请求相关地址参数及方法都填写正确,但是相应数据返回始终不对,例如 查看取样器结果显示 200 正常,但响应数据不符合正常的结果. 经反复检查发现问题如下: ...
- anaconda的安装教程和使用方法
一.anaconda安装方法: 1.下载: anaconda官方下载地址:https://www.anaconda.com/download/ 2.安装: 可以自己指定路劲,也可以选择默认安装,最后记 ...
- 关于用户输入恶意js
有些黑客经常闲得蛋疼的那别人的网站测试,利用一些输入的漏洞提交js代码,搞恶作剧. 对于freemarker视图的web应用,可以参考以下方法: http://yshjava.iteye.com/bl ...
- adb 查看包名或其他
http://blog.sina.com.cn/s/blog_5b478f870102v5bo.html
- 配置ssl
1.配置 <Connector port="80" protocol="HTTP/1.1" connectionTimeout="20000&q ...