LuoguP5075 [JSOI2012]分零食
题意
有\(A\)个人,\(m\)个糖,你可以选择一个\(k\),使第\(1\)$k$个人每个人至少得到一个糖,并且第$k+1$\(A\)个人都得不到糖。\(m\)个糖必须给完。对于每个方案都有一个欢乐值,欢乐值=\(\prod_{i=1}^kOx_i^2+Sx_i+U\),其中\(OSU\)都是给定的系数,\(x_i\)为第\(i\)个人拿到的糖的数量。求所有方案的欢乐值的和。
这题不用NTT啊......
有个比较naive的\(dp\):设\(f_{i,j}\)表示前\(i\)个人一共拿到了\(j\)个糖的所有方案的欢乐值之和,那么有转移方程:
\]
初始值可以设\(f_{0,0}=1\)。这个\(dp\)的复杂度就是\(O(Am^2)\)。一个优化就是,由于最多前\(m\)个人拿到糖(每个人至少拿一个糖),所以\(i\)只用枚举到\(min(m,A)\),复杂度为\(O(m^3)\)。
观察转移方程的结构,可以发现这样一个优化:
=\sum_{k=2}^{j-i+1}f_{i-1,j-k}\times[O(k-1)^2+S(k-1)+U]\\
=\sum_{k=2}^{j-i+1}f_{i-1,j-k}\times(Ok^2+Sk+U)-
\sum_{k=2}^{j-i+1}f_{i-1,j-k}\times(2Ok-O+S)\\
=f_{i,j}-f_{i-1,j-1}\times(O+S+U)-
\sum_{k=2}^{j-i+1}f_{i-1,j-k}\times(2Ok-O+S)
\]
观察最后这个\(\sum\),设\(g_{i,j}=\sum_{k=1}^{j-i+1}f_{i-1,j-k}\times(2Ok-O+S)\);那么求\(f\)的式子可以写成:
f_{i,j}-f_{i-1,j-1}\times(O+S+U)-g_{i,j}+f_{i-1,j-1}\times(O+S)\\
=f_{i,j}-Uf_{i-1,j-1}-g_{i,j}
\]
那么\(f_{i,j}=f_{i,j-1}+Uf_{i-1,j-1}+g_{i,j}\)。
\(f\)的转移变成\(O(1)\)的了。但\(g\)还是\(O(n)\)的。观察\(g\)的结构,可以类似地写出求\(g\)的优化:
=\sum_{k=2}^{j-i+1}f_{i-1,j-k}\times[2O(k-1)-O+S]\\
=\sum_{k=2}^{j-i+1}f_{i-1,j-k}\times(2Ok-O+S)-
\sum_{k=2}^{j-i+1}f_{i-1,j-k}\times 2O\\
=g_{i,j}-f_{i-1,j-1}\times(O+S)-
\sum_{k=2}^{j-i+1}f_{i-1,j-k}\times 2O
\]
观察最后这个\(\sum\),设\(h_{i,j}=\sum_{k=1}^{j-i+1}f_{i-1,j-k}\times 2O\);那么求\(g\)的式子可以写成:
g_{i,j}-f_{i-1,j-1}\times(O+S)-h_{i,j}+f_{i-1,j-1}\times 2O\\
=g_{i,j}-f_{i-1,j-1}\times(S-O)-h_{i,j}
\]
那么\(g_{i,j}=g_{i,j-1}+f_{i-1,j-1}\times(S-O)+h_{i,j}\)。
每个\(g\)也可以\(O(1)\)求了,而且注意到\(h\)就是前缀和,每个\(h\)也可以\(O(1)\)求,所以整个\(dp\)被优化到了\(O(m^2)\)。
可以通过吗?时间上,复杂度虽然是\(O(m^2)\)的,但实际上由于\(i\leq j\),所以只需要循环\(\frac{m\times(m+1)}{2}\)次,也就是\(5\times 10^7\)级别,是可以过的。空间上,加上滚动数组优化也能过。
#include<bits/stdc++.h>
#define rg register
#define il inline
#define cn const
#define gc getchar()
#define fp(i,a,b) for(rg int i=(a),ed=(b);i<=ed;++i)
using namespace std;
typedef cn int cint;
il int rd(){
rg int x(0),f(1); rg char c(gc);
while(c<'0'||'9'<c){ if(c=='-') f=-1; c=gc; }
while('0'<=c&&c<='9') x=(x<<1)+(x<<3)+(c^48),c=gc;
return x*f;
}
template<typename T> il void ckmin(T &x,cn T &y){ if(x>y)x=y; }
cint maxn=10010;
int A,m,mod,O,S,U,ff,gg,hh,ans;
int f[2][maxn],g[2][maxn],h[2][maxn],pv=0,nw=1;
int main(){
m=rd(),mod=rd(),A=rd(),O=rd(),S=rd(),U=rd();
ff=U,gg=(S-O+mod)%mod,hh=(O<<1)%mod;
f[0][0]=1;
fp(i,1,min(m,A)){
h[nw][i-1]=g[nw][i-1]=f[nw][i-1]=0;
fp(j,i,m){
h[nw][j]=(h[nw][j-1]+hh*f[pv][j-1])%mod;
g[nw][j]=(g[nw][j-1]+gg*f[pv][j-1]+h[nw][j])%mod;
f[nw][j]=(f[nw][j-1]+ff*f[pv][j-1]+g[nw][j])%mod;
}
ans=(ans+f[nw][m])%mod;
nw^=pv^=nw^=pv;
}
printf("%d",ans);
return 0;
}
LuoguP5075 [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$个糖果会获得快乐值 ...
随机推荐
- 01-flask-helloWorld
代码 from flask import Flask # 创建Flask对象 app = Flask(__name__) # 定义路由 @app.route('/') def index(): # 函 ...
- 记一次 oracle 数据库在宕机后的恢复
系统:redhat 6.6 oracle版本: Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - Production 问题描述: ...
- 留心一下VS的这个调试代码的bug
最近和同事在Debug代码时,遇到一个诡异的问题,开始以为是代码问题,分析了之后发现是VS(v16.8.3)的bug,特此分享一下,如果大家近期遇到类似的问题,不要茫然. 这个bug重现的方式是,在d ...
- C# Attribute特性 泛型<T> 方法的out ref this(扩展方法) Equals与==
out ref out和ref的使用场景其实不一样.out适合在方法内返回一个额外的结果参数,而ref适合直接改变一个在方法外面的值,方法改变外部就改变,无需重新定义接住返回值再使用. out可以在方 ...
- Centos8 Docker+Nginx部署Asp.Net Core Nginx正向代理与反向代理 负载均衡实现无状态更新
首先了解Nginx 相关介绍(正向代理和反向代理区别) 所谓代理就是一个代表.一个渠道: 此时就涉及到两个角色,一个是被代理角色,一个是目标角色,被代理角色通过这个代理访问目标角色完成一些任务的过程称 ...
- windows使用git bash 无法交互键盘上下键移动选择选项的解决方法
目录 遇到的问题 解决方案 1. 直接通过数字键来选择 2. 使用 winpty 来启动命令 3. 将 git bash 换成 cmd 4. 使用vscode中是bash 遇到的问题 windows使 ...
- Redis 设计与实现 5:压缩列表
压缩列表是 ZSET.HASH和 LIST 类型的其中一种编码的底层实现,是由一系列特殊编码的连续内存块组成的顺序型数据结构,其目的是节省内存. ziplist 的结构 外层结构 下图展示了压缩列表的 ...
- Spring-Boot配置文件web性能(服务器)配置项(常用配置项为红色)
参数 介绍 server.address 服务器应绑定到的网络地址 server.compression.enabled = false 如果启用响应压缩 server.compression.exc ...
- 技术选型关于redis客户端选择
redis作为分布式缓存框架的首选 相信已经毋庸置疑.能高效.合理的使用好它 必定能提升系统的可用性,高性能.高吞吐量的保障.但选择一个客户端,充分发挥它的能力,就是一个选型问题.现在市场上能选择 ...
- gcc/g++命令参数
在windows环境下,我们运行一程序,只需要在VS中点击运行按键即可,VS帮我们做完了程序的预处理.编译.汇编.链接阶段 但是在linux环境下,我们只能借助gcc/g++完成这一系列的操作 -o参 ...