bzoj4332[JSOI2012]分零食
一下午被这题的精度续掉了...首先可以找出一个多项式的等比数列的形式,然后类似poj的Matrix Series,不断倍增就可以了.用复数点值表示进行多次的多项式运算会刷刷地炸精度...应当用int存多项式,然后卷积的时候再dft成复数,卷积之后idft回实数.注意两个m次的多项式卷积之后会变成2m次的多项式,多项式的后一半需要清零.
- #include<cstdio>
- #include<cstring>
- #include<cmath>
- #include<algorithm>
- using namespace std;
- const int maxn=**;
- #define double long double
- const double pi=acos(-);
- struct comp{
- double x,y;
- comp(){}
- comp(double a,double b){x=a;y=b;}
- comp operator +(const comp &a){return comp(x+a.x,y+a.y);}
- comp operator -(const comp &a){return comp(x-a.x,y-a.y);}
- comp operator *(const comp &a){return comp(x*a.x-y*a.y,x*a.y+y*a.x);}
- } ;//a:存储原始多项式 b:存储原始多项式的卷积 c:存储答案 d:存储原多项式的n/2次方
- int mod;
- int a[maxn],c[maxn],d[maxn],e[maxn];
- void fft(comp* a,int n,int sign){
- for(int i=,j=,k=n;i<n;++i,k=n){
- do j^=(k>>=);while(j<k);if(i<j)swap(a[i],a[j]);
- }
- for(int j=;j<=n;j<<=){
- int m=j>>;comp wn(cos(pi*/j),sign*sin(pi*/j));
- for(comp *p=a;p!=a+n;p=p+j){
- comp w(,);
- for(int k=;k<m;++k,w=w*wn){
- comp t=p[m+k]*w;p[m+k]=p[k]-t;p[k]=p[k]+t;
- }
- }
- }
- if(sign==-){
- for(int i=;i<n;++i)a[i].x/=n;
- }
- }
- int N=;int m;
- int mo(double x){
- return (((int)floor(x+0.5))%mod+mod)%mod;
- }
- void mult(int *a,int *b,int *res){
- static comp tmp1[maxn],tmp2[maxn];
- for(int i=;i<N;++i)tmp1[i]=comp(a[i],),tmp2[i]=comp(b[i],);
- fft(tmp1,N,);fft(tmp2,N,);
- for(int i=;i<N;++i)tmp1[i]=tmp1[i]*tmp2[i];
- fft(tmp1,N,-);
- for(int i=;i<N;++i)res[i]=mo(tmp1[i].x);
- }
- void qsum(int n){
- if(n==){
- for(int i=;i<N;++i)c[i]=a[i];
- for(int i=;i<N;++i)d[i]=a[i];
- }else{
- qsum(n>>);
- mult(c,d,e);
- //for(int i=0;i<N;++i)
- //e[i]=c[i]*d[i]+c[i];
- for(int i=;i<N;++i)c[i]=mo(c[i]+e[i]);
- memset(c+(N>>),,sizeof(comp)*(N>>));
- if(n&){
- mult(c,a,e);
- for(int i=;i<N;++i)c[i]=mo(a[i]+e[i]);
- memset(c+(N>>),,sizeof(comp)*(N>>));
- }
- mult(d,d,d);
- memset(d+(N>>),,sizeof(comp)*(N>>));
- if(n&){
- mult(d,a,d);
- memset(d+(N>>),,sizeof(comp)*(N>>));
- }
- }
- }
- int main(){
- scanf("%d%d",&m,&mod);
- int n,o,s,u;scanf("%d%d%d%d",&n,&o,&s,&u);
- n=min(n,m);
- for(int i=;i<=m;++i){
- int t=i%mod;
- a[i]=(o*t*t+s*t+u)%mod;
- }
- while(N<=m)N<<=;N<<=;
- qsum(n);printf("%d\n",c[m]);
- return ;
- }
bzoj4332[JSOI2012]分零食的更多相关文章
- BZOJ4332 JSOI2012 分零食 【倍增 + NTT】
题目链接 权限题BZOJ4332 题解 容易想到\(dp\) 设\(g[i][j]\)表示前\(i\)人分到\(j\)颗糖的所有方案的乘积之和 设\(f(x) = Ox^2 + Sx + U\) \[ ...
- bzoj千题计划309:bzoj4332: JSOI2012 分零食(分治+FFT)
https://www.lydsy.com/JudgeOnline/problem.php?id=4332 因为如果一位小朋友得不到糖果,那么在她身后的小朋友们也都得不到糖果. 所以设g[i][j] ...
- 【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\) 现 ...
- [洛谷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 ...
随机推荐
- redis 学习笔记三
一.redis 复制 数据库复制指的是发生在不同数据库实例之间,单向的信息传播的行为,通常由被复制方和复制方组成,被复制方和复制方之间建立网络连接,复制方式通常为被复制方主动将数据发送到复制方,复制方 ...
- iOS UIWebView加载时添加进度条01
标注:此框架仅适合UIWebView 对iOS8后新出的WKWebView不适用,当然,你可以尝试修改框架里的几个代理方法. 框架是:NJKWebViewProgress 导入头文件 #import ...
- 「国庆训练」Bomb(HDU-5934)
题意 给定\(n\)个炸弹,每个炸弹的坐标与代价与影响范围给定,炸弹会引爆影响范围内其他所有炸弹.求引爆所有炸弹的最小代价. 分析 先做\(n^2\)的循环,然后建图,对\(i\)能引爆\(j\)建边 ...
- WEB中间件漏洞--IIS
1.iis安装 版本 一直下一步,选上iis安装 端口修改 网站目录 通过网站发布目录(发布目录任意),新建index.html页面,可以正常访问 2.iis6.0解析漏洞 (1)文件名解析 IIS在 ...
- android自动化のadb常用命令(不定期更新)
1. adb devices 执行结果是adb为每一个设备输出以下状态信息:序列号(serialNumber) — 由adb创建的使用控制台端口号的用于唯一标识一个模拟器或手机设备的字符串,格式是 & ...
- Javascript打印网页局部的实现方案
项目中,需要对页面的部分div进行打印,为了保证界面布局不乱,采取了新建iframe的方法. 将需要打印的div放到iframe中,然后调用iframe进行打印,就可以很好的实现局部打印的效果了. 同 ...
- C++11 TypeList 妙用
源码展示: #include <iostream> using namespace std; template <typename ... Args> struct typel ...
- 前端开发工程师 - 05.产品前端架构 - 协作流程 & 接口设计 & 版本管理 & 技术选型 &开发实践
05.产品前端架构 第1章--协作流程 WEB系统 角色定义 协作流程 职责说明 第2章--接口设计 概述 接口规范 规范应用 本地开发 第3章--版本管理 见 Java开发工程师(Web方向) - ...
- TW实习日记:第27天
今天依旧是磨洋工的一天,说真的,被存在各种问题的后端接口把耐心和动力都给磨没了.于是一天就又在沟通接口问题中度过了,完善了一个新功能,将一个新功能开发到了一半.效率可真是够低的,唉.然后不知道为什么突 ...
- UVa 1586 - Molar Mass - ACM/ICPC Seoul 2007 - C语言
关键在于判断数字是两位数还是单位数,其他部分没有难度. #include"stdio.h" #include"string.h" #include"c ...