描述

这里是欢乐的进香河,这里是欢乐的幼儿园。

今天是2月14日,星期二。在这个特殊的日子里,老师带着同学们欢乐地跳着,笑着。校长从幼儿园旁边的小吃店买了大量的零食决定分给同学们。听到这个消息,所有同学都安安静静地排好了队,大家都知道,校长不喜欢调皮的孩子。

同学们依次排成了一列,其中有A位小朋友,有三个共同的欢乐系数O,S和U。如果有一位小朋友得到了x个糖果,那么她的欢乐程度就是f(x)=Ox^2+Sx+U。

现在校长开始分糖果了,一共有M个糖果。有些小朋友可能得不到糖果,对于那些得不到糖果的小朋友来说,欢乐程度就是1。如果一位小朋友得不到糖果,那么在她身后的小朋友们也都得不到糖果。(即这一列得不到糖果的小朋友一定是最后的连续若干位)

所有分糖果的方案都是等概率的。现在问题是:期望情况下,所有小朋友的欢乐程度的乘积是多少?呆呆同学很快就有了一个思路,只要知道总的方案个数T和所有方案下欢乐程度乘积的总和S,就可以得到答案Ans=S/T。现在他已经求出来了T的答案,但是S怎么求呢?他就不知道了。你能告诉他么?

因为答案很大,你只需要告诉他S对P取模后的结果。

后记:

虽然大家都知道,即便知道了T,知道了S对P取模后的结果,也没有办法知道期望情况下,所有小朋友欢乐程度的乘积。但是,当呆呆想到这一点的时候,已经彻底绝望了。

格式

输入格式

第一行有2个整数,分别是M和P。

第二行有一个整数A,第三行有一个整数O。

第四行有一个整数S,第五行有一个整数U。

输出格式

一个整数S,因为答案可能很大,你只需要输出S 对P取模后的结果。

看到很多大佬虐这道题,我也很好奇就写了写。

题里直接给了个生成函数$c$和一个卷积的形式$c^x$,如果题里没有要求拿到糖的人是一个前缀的话直接令$c[0]=1$求一发多项式快速幂就行了。

但有了限制之后,考虑枚举得到糖的人数,因为不能有人没有糖,令$c[0]=0$。

设$f[i]$表示只有i个糖时的答案,最后答案为$f[m]$,则

$$f=\sum_{i=1}^{A}c^i$$

感觉如果模数合适的话应该可以等比数列求和直接做吧。。。开始还以为是一道水题

但显然这道题不行,那就考虑倍增。

设$g[i]=c^{2^i},sumg[i]=\sum_{i=1}^{2^i}c^i$

把$A$二进制拆分后用上边两个数组显然是可以求出来的,懒得写了。。。

注意FFT完往回赋值时只赋$0-m$,不要把FFT完的整个数组都赋回去,调了一晚上不知道哪错了。。。

 #include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
#define pi acos(-1)
#define N 50005
#define double long double
using namespace std;
struct E
{
double x,y;
E(){;}
E(double _x,double _y)
{
x=_x;y=_y;
}
friend E operator + (E a,E b)
{
return E(a.x+b.x,a.y+b.y);
}
friend E operator - (E a,E b)
{
return E(a.x-b.x,a.y-b.y);
}
friend E operator / (E a,double b)
{
return E(a.x/b,a.y/b);
}
friend E operator * (E a,E b)
{
return E(a.x*b.x-a.y*b.y,a.x*b.y+a.y*b.x);
}
}a[N],b[N];
int R[N],n;
void fft(E *a,int f)
{
for(int i=;i<n;i++)if(i<R[i])swap(a[i],a[R[i]]);
for(int i=;i<n;i<<=)
{
E wn(cos(pi/i),f*sin(pi/i));
for(int j=;j<n;j+=(i<<))
{
E w(,);
for(int k=;k<i;k++,w=w*wn)
{
E 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<n;i++)a[i]=a[i]/(double)n;
}
return ;
}
int m,p,A,O,S,U;
int c[N];
int g[][N],sg[][N];
void make(int *a1,int *a2,int *a3)
{
for(int i=;i<n;i++)a[i].x=a[i].y=b[i].x=b[i].y=;
for(int i=;i<n;i++)a[i].x+=a2[i];
for(int i=;i<n;i++)b[i].x+=a3[i];
fft(a,);fft(b,);
for(int i=;i<n;i++)a[i]=a[i]*b[i];
fft(a,-);
for(int i=;i<=m;i++)a1[i]=(int)(a[i].x+0.2);
for(int i=;i<=m;i++)a1[i]%=p;
}
int gg[N];
void solve()
{
for(int i=;i<n;i++)g[][i]=c[i];
for(int i=;i<=;i++)make(g[i],g[i-],g[i-]);
for(int i=;i<n;i++)sg[][i]=c[i];
for(int i=;i<=;i++)
{
for(int j=;j<n;j++)sg[i][j]=sg[i-][j];
make(gg,sg[i-],g[i-]);
for(int j=;j<n;j++)
{
sg[i][j]=sg[i][j]+gg[j];
if(sg[i][j]>=p)sg[i][j]-=p;
}
}
return ;
}
int ans[N],now[N];
void pw(int y)
{
now[]=;
for(int i=;i>=;i--)
{
if(y&(<<i))
{
make(gg,now,sg[i]);
make(now,now,g[i]);
for(int j=;j<n;j++)
{
ans[j]=ans[j]+gg[j];
if(ans[j]>=p)ans[j]-=p;
}
}
}
return ;
}
int main()
{
scanf("%d%d%d%d%d%d",&m,&p,&A,&O,&S,&U);
S%=p;O%=p;U%=p;
for(int i=;i<=m;i++)c[i]=(1LL*O*i*i%p+1LL*S*i%p+U)%p;
n=;int l=;
while(n<=*m)n<<=,l++;
for(int i=;i<n;i++)R[i]=(R[i>>]>>)|((i&)<<(l-));
if(A>m)A=m;
solve();
pw(A);
printf("%d\n",ans[m]);
return ;
}

bzoj 4332:JSOI2012 分零食的更多相关文章

  1. [BZOJ 4332] [JSOI2012]分零食(DP+FFT)

    [BZOJ 4332] [JSOI2012]分零食(DP+FFT) 题面 同学们依次排成了一列,其中有A位小朋友,有三个共同的欢乐系数O,S和U.如果有一位小朋友得到了x个糖果,那么她的欢乐程度就是\ ...

  2. bzoj 4332: JSOI2012 分零食 快速傅立叶变换

    题目: Description 同学们依次排成了一列,其中有A位小朋友,有三个共同的欢乐系数O,S和U.如果有一位小朋友得到了x个糖果,那么她的欢乐程度就是\(f(x)=O*x^2+S*x+U\) 现 ...

  3. BZOJ 4332: JSOI2012 分零食 FFT+分治

    好题好题~ #include <bits/stdc++.h> #define N 50020 #define ll long long #define setIO(s) freopen(s ...

  4. 【BZOJ 4332】 4332: JSOI2012 分零食 (FFT+快速幂)

    4332: JSOI2012 分零食 Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 119  Solved: 66 Description 这里是欢乐 ...

  5. bzoj千题计划309:bzoj4332: JSOI2012 分零食(分治+FFT)

    https://www.lydsy.com/JudgeOnline/problem.php?id=4332 因为如果一位小朋友得不到糖果,那么在她身后的小朋友们也都得不到糖果. 所以设g[i][j] ...

  6. bzoj4332;vijos1955:JSOI2012 分零食

    描述 这里是欢乐的进香河,这里是欢乐的幼儿园. 今天是2月14日,星期二.在这个特殊的日子里,老师带着同学们欢乐地跳着,笑着.校长从幼儿园旁边的小吃店买了大量的零食决定分给同学们.听到这个消息,所有同 ...

  7. BZOJ4332 JSOI2012 分零食 【倍增 + NTT】

    题目链接 权限题BZOJ4332 题解 容易想到\(dp\) 设\(g[i][j]\)表示前\(i\)人分到\(j\)颗糖的所有方案的乘积之和 设\(f(x) = Ox^2 + Sx + U\) \[ ...

  8. bzoj4332[JSOI2012]分零食

    一下午被这题的精度续掉了...首先可以找出一个多项式的等比数列的形式,然后类似poj的Matrix Series,不断倍增就可以了.用复数点值表示进行多次的多项式运算会刷刷地炸精度...应当用int存 ...

  9. [洛谷P5075][JSOI2012]分零食

    题目大意:有$m(m\leqslant10^8)$个人站成一排,有$n(n\leqslant10^4)$个糖果,若第$i$个人没有糖果,那么第$i+1$个人也没有糖果.一个人有$x$个糖果会获得快乐值 ...

随机推荐

  1. yocto-sumo源码解析(七): BitBakeServer

    1. 创建域套接字,管道以及锁: self.configuration = configuration self.featureset = featureset self.sockname = soc ...

  2. Maven ResourceBundle.getBundle读取Properties异常MissingResourceException: Can't find bundlei解决方法

    参考:https://blog.csdn.net/thousa_ho/article/details/72817616 问题描述 ResourceBundle读取properties配置文件提示 Mi ...

  3. Erlang数据类型的表示和实现(1)——数据类型回顾

    本文介绍 Erlang 语言中使用的各种数据类型以及这些数据类型在 Erlang 虚拟机内部的表示和实现.了解数据类型的实现可以帮助大家在实际开发过程中正确选择数据类型,并且可以更好更高效地操作这些数 ...

  4. xml配置文件特殊符号的处理方法

    2017.7.19遇到问题:偶然出现“认证失败,请重新登录”的现象   在xml中英文问号“?”是可以被正常解析的,但是以下这几种符号是不能正常解析的:分别是“&”.“<”.“>” ...

  5. 2017年软件工程第十二次作业-PSP总结报告

    回顾1 1.回想一下你曾经对计算机专业的畅想 当初你是如何做出选择计算机专业的决定的?经过一个学期,你的看法改变了么,为什么? 你认为过去接触到的课程是否符合你对计算机专业的期待,为什么?经过一个学期 ...

  6. js实现把一个页面层数据传递到另一个页面

    由于之前面试,被问到过此问题,所以今天特意整理了一下.由于自己技术水平有限,若存在错误,欢迎提出批评. 本博客整理了两种方式从一个页面层向另一个页面层传递参数. 一. 通过cookie方式 1. 传递 ...

  7. vs2013+python+ cocos2d-x-3.3rc0环境搭建

    1.vs2013安装一路next,安装即可,时间1~2个小时 2.解压cocos2d-x-3.3rc0   build文件夹里会有名为  cocos2d-win32.vc2012的sln文件  打开  ...

  8. 使用exe4j将jar包导出为exe

    Exe4J使用方法 此工具是将Java程序包装成exe格式文件工具.(点击exe4j\bin\exe4j.exe文件)启动后如下图所示 如果未注册,则可使用这个注册码:A-XVK209982F-1y0 ...

  9. “吃神么,买神么”的第一个Sprint计划(第二天)

    “吃神么,买神么”项目Sprint计划 ——5.22(第二天)立会内容与进度 团队组员各自任务: 冯美欣:logo的设计.搜索框的制作,"登陆/注册"的文字链接: 吴舒婷:导航条. ...

  10. Good Time 冲刺 一

    2018/6/14 我们组之前没有开发小程序的经验,所以在尝试中不断探索与学习.在完成小程序的初步注册和界面完善后,我们组开始进行开发任务. 1.1成员简述: 王怡镔:“今天主要学习小程序开发知识及相 ...