推一下式子发现是裸的FFT,$ans[k]=\sum_{i}\sum_{j}[i+j=k]a[i]*C_{m-1+j}^{j}$

比较坑爹的就是这个模数,于是我们上任意模数的FFT

任意模数的FFT目的就是降低卷积中的元素上界,我们设$P=\lfloor \sqrt{mod} \rfloor$,

我们将原函数中的系数变成两个$a1[i]=a[i]/P,a2[i]=a[i]%P,b1[i]=b[i]/P,b2[i]=b[i]%P$

这样我们新卷积出来的值的上限是$n*mod$,

$P^2$的系数是$a1*b1$,$P$的系数是$a1*b2+a2*b1$,$1$的系数是$a2*b2$,然后我们再分别卷积,最后统计答案即可

一开始炸精了。。改成预处理单位复数根就好了。

 #include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <cmath>
#define mod 1000000007
#define MAXN 131072
using namespace std;
const double pi=acos(-1.0);
const int P=;
struct cmx{
double x,y;
cmx(){}
cmx(double a,double b){x=a,y=b;}
cmx operator + (cmx a){return cmx(x+a.x,y+a.y);}
cmx operator - (cmx a){return cmx(x-a.x,y-a.y);}
cmx operator * (cmx a){return cmx(x*a.x-y*a.y,x*a.y+y*a.x);}
cmx operator / (double a){return cmx(x/a,y/a);}
}A[MAXN],B[MAXN],C[MAXN],D[MAXN],E[MAXN],F[MAXN],G[MAXN],wn[MAXN],inv[MAXN];
int n,m,N,rev[MAXN];
long long ans[MAXN],a[MAXN],b[MAXN];
void fft(cmx *a,int o, cmx *wn){
register int i,j,k;
cmx t;
for(i=;i<N;i++)if(i<rev[i])swap(a[i],a[rev[i]]);
for(k=;k<=N;k<<=)
for(j=;j<N;j+=k)
for(i=;i<(k>>);i++){
t=wn[N/k*i]*a[i+j+(k>>)];
a[i+j+(k>>)]=a[i+j]-t;
a[i+j]=a[i+j]+t;
}
if(o==-)for(i=;i<N;i++)a[i]=a[i]/N;
}
void FFT(long long *a,long long *b,long long *ans){
register int i;
for(i=;i<N;i++){
A[i]=cmx(a[i]/P,);
B[i]=cmx(a[i]%P,);
C[i]=cmx(b[i]/P,);
D[i]=cmx(b[i]%P,);
}
fft(A,,wn);fft(B,,wn);fft(C,,wn);fft(D,,wn);
for(i=;i<N;i++){
E[i]=A[i]*C[i];
F[i]=A[i]*D[i]+B[i]*C[i];
G[i]=B[i]*D[i];
}
fft(E,-,inv);fft(F,-,inv);fft(G,-,inv);
register long long tmp;
for(i=;i<n;i++){
tmp=1ll*round(E[i].x);
ans[i]=tmp%mod*P%mod*P%mod;
tmp=1ll*round(F[i].x);
(ans[i]+=tmp%mod*P%mod)%=mod;
(ans[i]+=1ll*round(G[i].x))%=mod;
}
}
long long qp(long long a,int b){
long long c=;
while(b){
if(b&)c=c*a%mod;
a=a*a%mod; b>>=;
}return c;
}
int main(){
scanf("%d%d",&n,&m);
register int i;
for(i=;i<n;i++)scanf("%lld",&a[i]);
b[]=;
for(i=;i<n;i++)
b[i]=1ll*b[i-]*(m-+i)%mod*qp(i,mod-)%mod;
for(N=;N<(n<<);N<<=);
for(i=;i<N;i++){
if(i&)rev[i]=(rev[i>>]>>)|(N>>);
else rev[i]=rev[i>>]>>;
}
for(i=;i<N;i++)
wn[i]=cmx(cos(*pi/N*i),sin(*pi/N*i)),
inv[i]=cmx(cos(*pi/N*i),-sin(*pi/N*i));
FFT(a,b,ans);
for(i=;i<n;i++)printf("%lld\n",ans[i]);
return ;
}

51nod1172 Partial Sums V2的更多相关文章

  1. 51nod 1172 Partial Sums V2 卡精度的任意模数FFT

    卡精度的任意模数fft模板题……这道题随便写个表就能看出规律来(或者说考虑一下实际意义),反正拿到这题之后,很快就会发现他是任意模数fft模板题.然后我就去网上抄了一下板子……我打的是最土的任意模数f ...

  2. 51nod 1172 Partial Sums V2

    题目 给出一个数组A,经过一次处理,生成一个数组S,数组S中的每个值相当于数组A的累加,比如:A = {1 3 5 6} => S = {1 4 9 15}.如果对生成的数组S再进行一次累加操作 ...

  3. 51nod1161 Partial Sums

    开始想的是O(n2logk)的算法但是显然会tle.看了解题报告然后就打表找起规律来.嘛是组合数嘛.时间复杂度是O(nlogn+n2)的 #include<cstdio> #include ...

  4. Non-negative Partial Sums(单调队列)

    Non-negative Partial Sums Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 65536/32768 K (Jav ...

  5. hdu 4193 Non-negative Partial Sums 单调队列。

    Non-negative Partial Sums Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 65536/32768 K (Jav ...

  6. TOJ 1721 Partial Sums

    Description Given a series of n numbers a1, a2, ..., an, the partial sum of the numbers is defined a ...

  7. 【计数】cf223C. Partial Sums

    考试时候遇到这种题只会找规律 You've got an array a, consisting of n integers. The array elements are indexed from ...

  8. CodeForces 223C Partial Sums 多次前缀和

    Partial Sums 题解: 一个数列多次前缀和之后, 对于第i个数来说他的答案就是 ; i <= n; ++i){ ; j <= i; ++j){ b[i] = (b[i] + 1l ...

  9. 51 Nod 1161 Partial sums

    1161 Partial Sums  题目来源: CodeForces 基准时间限制:2 秒 空间限制:131072 KB 分值: 80 难度:5级算法题  收藏  取消关注 给出一个数组A,经过一次 ...

随机推荐

  1. spring是如何管理 事务的

    Spring提供的事务管理可以分为两类:编程式的和声明式的.编程式的,比较灵活,但是代码量大,存在重复的代码比较多:声明式的比编程式的更灵活方便.  1.传统使用JDBC的事务管理  以往使用JDBC ...

  2. IT实用技术资源整理

    花了一下午整理出了常用的且比较实用的网站,以及一些收藏的资源,希望对大家有帮助! 常用技术资料 Python中文开发者社区 Python中文官方文档 开源中国社区 Python机器学习 jmeter插 ...

  3. 安装Emacs并设置racket环境

    最近在阅读sicp这本书,书中的代码是使用scheme实现的.之前阅读的时候是使用Dr.Racket来完成写练习的,可我觉得与其这样,不如一步到位,使用emacs+lisp解释器来的比较快. 安装em ...

  4. scons脚本示例

    import os def list_dir(dir): all_dirs = [] for root, dirs, files in os.walk('./', True): for name in ...

  5. 【转】地球坐标系 (WGS-84) 到火星坐标系 (GCJ-02) 的转换算法

    // // Copyright (C) 1000 - 9999 Somebody Anonymous // NO WARRANTY OR GUARANTEE // using System; name ...

  6. Python flask中的配置

    当你开始学习Flask时,配置看上去是小菜一碟.你仅仅需要在config.py定义几个变量,然后万事大吉. 然而当你不得不管理一个生产上的应用的配置时,这一切将变得棘手万分. 你不得不设法保护API密 ...

  7. 安装vmware tool时出错

    背景: 我想要在win10系统和vmware的ubuntu之间实现磁盘共享,从而实现文件共享.百度到可以通过安装vmware tools实现,所以着手安装vmware tools 问题: 安装vmwa ...

  8. 也许CTO并不是终点——没有净土

    开篇 不想做将军的士兵不是好士兵,这句话可以有很功利的理解方式,对应到我们自己很可能是:不想做CTO的程序员不是好程序员!几年前对这句话的理解与现在有很多不同,因为我现在已经是一名中小型公司的CTO了 ...

  9. SpringCloud实战-Eureka

    熟悉微服务架构或Dubbo框架的都知道,微服务中最核心.最基础的组件就是注册中心了.下面利用Spring Cloud Eureka实现服务注册中心.并注册一个简单的服务提供者. 首先先创建一个spir ...

  10. mysql学习 第二章 数据库的基本操作

    3.1   创建数据库 MySQL安装好之后,首先需要创建数据库,这是使用MySQL各种功能的前提.本章将详细介绍数据的基本操作,主要内容包括:创建数据库.删除数据库.不同类型的数据存储引擎和存储引擎 ...