bzoj4332[JSOI2012]分零食

一下午被这题的精度续掉了...首先可以找出一个多项式的等比数列的形式,然后类似poj的Matrix Series,不断倍增就可以了.用复数点值表示进行多次的多项式运算会刷刷地炸精度...应当用int存多项式,然后卷积的时候再dft成复数,卷积之后idft回实数.注意两个m次的多项式卷积之后会变成2m次的多项式,多项式的后一半需要清零.

#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
using namespace std;
const int maxn=1024*32*4;
#define double long double
const double pi=acos(-1);
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=1,j=0,k=n;i<n;++i,k=n){
    do j^=(k>>=1);while(j<k);if(i<j)swap(a[i],a[j]);
  }
  for(int j=2;j<=n;j<<=1){
    int m=j>>1;comp wn(cos(pi*2/j),sign*sin(pi*2/j));
    for(comp *p=a;p!=a+n;p=p+j){
      comp w(1,0);
      for(int k=0;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==-1){
    for(int i=0;i<n;++i)a[i].x/=n;
  }
}
int N=1;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=0;i<N;++i)tmp1[i]=comp(a[i],0),tmp2[i]=comp(b[i],0);
  fft(tmp1,N,1);fft(tmp2,N,1);
  for(int i=0;i<N;++i)tmp1[i]=tmp1[i]*tmp2[i];
  fft(tmp1,N,-1);
  for(int i=0;i<N;++i)res[i]=mo(tmp1[i].x);
}
void qsum(int n){
  if(n==1){
    for(int i=0;i<N;++i)c[i]=a[i];
    for(int i=0;i<N;++i)d[i]=a[i];
  }else{
    qsum(n>>1);
    mult(c,d,e);
//for(int i=0;i<N;++i)
      //e[i]=c[i]*d[i]+c[i];
    for(int i=0;i<N;++i)c[i]=mo(c[i]+e[i]);
    memset(c+(N>>1),0,sizeof(comp)*(N>>1));
    if(n&1){
      mult(c,a,e);
      for(int i=0;i<N;++i)c[i]=mo(a[i]+e[i]);
      memset(c+(N>>1),0,sizeof(comp)*(N>>1));
    }

    mult(d,d,d);
    memset(d+(N>>1),0,sizeof(comp)*(N>>1));

    if(n&1){
      mult(d,a,d);
      memset(d+(N>>1),0,sizeof(comp)*(N>>1));
    }

  }
}
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=1;i<=m;++i){
    int t=i%mod;
    a[i]=(o*t*t+s*t+u)%mod;
  }
  while(N<=m)N<<=1;N<<=1;
  qsum(n);printf("%d\n",c[m]);
  return 0;
}
时间: 2024-10-12 08:48:22

bzoj4332[JSOI2012]分零食的相关文章

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]

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

4332: JSOI2012 分零食 Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 119  Solved: 66 Description 这里是欢乐的进香河,这里是欢乐的幼儿园. 今天是2月14日,星期二.在这个特殊的日子里,老师带着同学们欢乐地跳着,笑着.校长从幼儿园旁边的小吃店买了大量的零食决定分给同学们.听到这个消息,所有同学都安安静静地排好了队,大家都知道,校长不喜欢调皮的孩子. 同学们依次排成了一列,其中有A位小朋友,有三个共同的欢乐

vijos1955:JSOI2012 分零食

描述 这里是欢乐的进香河,这里是欢乐的幼儿园. 今天是2月14日,星期二.在这个特殊的日子里,老师带着同学们欢乐地跳着,笑着.校长从幼儿园旁边的小吃店买了大量的零食决定分给同学们.听到这个消息,所有同学都安安静静地排好了队,大家都知道,校长不喜欢调皮的孩子. 同学们依次排成了一列,其中有A位小朋友,有三个共同的欢乐系数O,S和U.如果有一位小朋友得到了x个糖果,那么她的欢乐程度就是f(x)=Ox^2+Sx+U. 现在校长开始分糖果了,一共有M个糖果.有些小朋友可能得不到糖果,对于那些得不到糖果的

【JSOI2012】 分零食 生成函数 FFT

我们构造$f(x)$的生成函数$G(x)$,那么显然$[x^k]G(x)=Ok^2+Sk+U$ 那么显然,答案即为$\sum_{i=1}^{n} [x^m]G^i(x)$ 我们构造答案的生成函数$F(x)=\sum_{i=1}^{n} G^i(x)$ 根据等比数列求和公式,$F(x)=\dfrac{1-G(x)}{1-G^{A+1}(x)}$ 如果去等比数列求和的话,你需要多项式快速幂+多项式求逆,时间复杂度显然是$O(m\ log\ m)$的. 然而这个模数并不是质数,所以这么搞不是很好搞.

【2017 4 12 总结】

今天做JSOI2012的题. 才120,其实是可以拿很多部分分什么的,但是都打错... (代码实现能力太差了. 1. 4330: JSOI2012 爱之项链 Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 50  Solved: 24 Description 在进香河,流传着这样一段美丽的故事.zyg与kzn是两个生活在进香河的孩子,一天,他们两人闹矛盾了,于是zyg送给了kzn一条精美的爱之项链.从此他们幸福生活在一起. 这则故事的真实性到今天已

大集训的第二个小总结

时间从8.2又到了8.9号,过去了一周,又考了5场试,又有学长来讲东西,但也有不少福利,先是分西瓜,后来又是分零食,昨天又分了香蕉,不错不错. 照例先说一下考试,这次数据还没下来,回头补吧. 第一次,16名. 第二次,6名. 第三次,1名. 第四次,25名. 第五次,20名. 好吧,前期发育猥琐,后期打的不好.最终刨去两个高一大佬12名,还是没进前十,算了,习惯这种心碎的感觉了. 同桌Q某犇说我贪得无厌,或许吧,但我觉得如果有一天我真的不去追求更高的能力恐怕我就会去退役了吧. 知识方面比起上次貌

一个简单的文件管理程序

IEEE Spectrum 杂志发布了一年一度的编程语言排行榜,这也是他们发布的第四届编程语言 Top 榜. 据介绍,IEEE Spectrum 的排序是来自 10 个重要线上数据源的综合,例如 Stack Overflow.Twitter.Reddit.IEEE Xplore.GitHub.CareerBuilder 等,对 48 种语言进行排行. 与其他排行榜不同的是,IEEE Spectrum 可以让读者自己选择参数组合时的权重,得到不同的排序结果.考虑到典型的 Spectrum 读者需求

HNUSTOJ-1639 分糖果(几何)

1639: 分糖果 时间限制: 1 Sec  内存限制: 128 MB提交: 261  解决: 118[提交][状态][讨论版] 题目描述 为了实验室的发展,吴大大采购了一箱零食O(∩_∩)O~~ 在吴大大取快递的时候,实验室已经已经默默地聚集了一堆吃货,准备抢劫他,为了避免发生由一袋零食引发的血案,同时也是为了体现我们实验室的和谐,在实验室的N个人达成了一个协议:等吴大大一回来,大家就包围他!但是每个人必须保证距离吴大大1m,并且相邻两人间的距离相等. 但是实验室的N个人都不知道怎么站更加合适

最受欢迎的校园零食

休闲零食常被我们作为休息与闲暇时的食品 也有人用于餐前垫饥 然而随着人们生活水平的提高 零食更成为大家日常生活中的必备消费品 我们可以发现,超市里.便利店里.小卖部里 休闲零食款式繁多,玲琅满目 零食的选择性非常多 但作为校园零食的资深的吃货 选择好吃又健康的零食是我的责任 必须选择健康.绿色.安全.营养的休闲零食 吖拇片刻铁棍山药薯片 产品的品质高.口味好是众所周知的 因此口碑相传,受到广大吃货们的青睐 分分享校园零食的我们追求的不仅外表好看 吖拇更注重产品的营养健康,口感独特 吖拇铁棍山药碎