题目链接

戳我

题意简述

你有长为\(n\)的序列和\(Q\)个询问,每次询问一个\(k\),求用\(k\)个数组成的不同方案的乘积的和。

sol

显然要预处理一波。

考虑分治,左右两边都求出来后,怎么合并。

设\(A[i]\)为整体用\(i\)个数的乘积和,\(B[i]\)为左边用\(i\)个数的乘积和,\(C[i]\)为右边用\(i\)个数的乘积和。

则很显然有\(A[i]=\sum_{j=0}^i B[j]C[i-j]\)

这是一个卷积然后NTT就好了,然而怎么模数是1e5+3,那就双模数NTT吧,虽然常数巨大,FFT也可以,写的好的话常数优秀5~6倍。总复杂度\(O(nlog^2n)\)。

疯狂压行ing~

#include<cstdio>
#include<cstring>
#include<algorithm>
#define gt getchar()
#define ll long long
#define File(s) freopen(s".in","r",stdin),freopen(s".out","w",stdout)
inline int in(){int k=0;char ch=gt;while(ch<'-')ch=gt;while(ch>'-')k=k*10+ch-'0',ch=gt;return k;}
const int N=3e5+5,g=3,p[]={998244353,1004535809},inv[]={669690699,332747959};const ll MOD=1ll*p[0]*p[1];
int rev[N],v1[N],v2[N],v3[N],v4[N];ll f[50][N];
inline int MO(const int &a,int now){return a>=p[now]?a-p[now]:a;}
inline int ksm(int a,int k,int now){int r=1;while(k){if(k&1)r=1ll*r*a%p[now];a=1ll*a*a%p[now],k>>=1;}return r;}
inline ll mul(ll a,ll k ){ll r=0;while(k){if(k&1)r=(r + a)% MOD ;a=(a + a)% MOD ,k>>=1;}return r;}
void get_rev(int len,int qwq){rev[0]=0;for(int i=1;i<len;++i)rev[i]=(rev[i>>1]>>1)|((i&1)<<qwq-1);}
void ntt(int *a,int len,int opt,int now)
{
#define YL p[now]
for(int i=0;i<len;++i)if(i<rev[i])std::swap(a[i],a[rev[i]]);
for(int st=2,m=1;st<=len;st<<=1,m<<=1)
{
int wn=ksm(g,opt==1?(YL-1)/st:YL-1-(YL-1)/st,now);
for(int *pp=a;pp!=a+len;pp+=st)
for(int k=0,wnk=1;k<m;++k,wnk=1ll*wnk*wn%YL)
{
int t=1ll*wnk*pp[k+m]%YL;
pp[k+m]=MO(pp[k]-t+YL,now);
pp[k]=MO(pp[k]+t,now);
}
}
if(opt==1)return;int inv=ksm(len,YL-2,now);
for(int i=0;i<len;++i)a[i]=1ll*a[i]*inv%YL;
#undef YL
}
const int YL=1e5+3;
int a[N];
void get_mul(int *a,int *b,int len,int now)
{
ntt(a,len, 1,now);ntt(b,len, 1,now);
for(int i=0;i<len;++i)a[i]=1ll*a[i]*b[i]%p[now];
ntt(a,len,-1,now);
}
void cdq_fft(int l,int r,int x)
{
for(int i=0;i<=r-l+1;++i)f[x][i]=0;
if(l==r){f[x][0]=1,f[x][1]=a[l];return;}
int mid=l+r>>1;cdq_fft(l,mid,x+1);
for(int i=0;i<=r-l+1;++i)f[x][i]=f[x+1][i];cdq_fft(mid+1,r,x+1);
int m=r-l+1,qwq=0,len=1;
while(len<=m)len<<=1,++qwq;get_rev(len,qwq);
for(int i=r-mid+1;i<len;++i)f[x+1][i]=0;
for(int i=mid-l+2;i<len;++i)f[ x ][i]=0;
for(int i=0;i<len;++i)v1[i]=v2[i]=f[x][i],v3[i]=v4[i]=f[x+1][i];
get_mul(v1,v3,len,0);get_mul(v2,v4,len,1);
for(int i=0;i<=m;++i)
{
f[x][i]=mul(1ll*v1[i]*p[1]%MOD,inv[1]);
ll tttt=mul(1ll*v2[i]*p[0]%MOD,inv[0]);
f[x][i]=(f[x][i]+tttt)%MOD;
f[x][i]=(f[x][i]+YL)%YL;
}
}
int main()
{
int n=in(),q=in();for(int i=1;i<=n;++i)a[i]=in()%YL;
cdq_fft(1,n,0);while(q--)printf("%lld\n",f[0][in()]);
return 0;
}

51nod乘积之和的更多相关文章

  1. 51nod 1348 乘积之和

    用(r-l+2)维向量f[l,r]表示区间[l,r]内选i个数(0<=i<=r-l+1)相乘的所有方案之和,可以发现f[l,r]=f[l,m]*f[m+1,r],题目模数100003较小, ...

  2. 51Nod 最小公倍数之和V3

    这题公式真tm难推……为了这题费了我一个草稿本…… woc……在51Nod上码LaTeX码了两个多小时…… 一开始码完了前半段,刚码完后半段突然被51Nod吃了,重新码完后半段之后前半段又被吃了,吓得 ...

  3. 51Nod 约数之和

                              1220 约数之和                                  题目来源: Project Euler 基准时间限制:3 秒 ...

  4. POJ1651 Multiplication Puzzle(相邻乘积之和最小,区间DP)

    http://blog.csdn.net/libin56842/article/details/9747021 http://www.cnblogs.com/devil-91/archive/2012 ...

  5. 51 NOD 1238 最小公倍数之和 V3

    原题链接 最近被51NOD的数论题各种刷……(NOI快到了我在干什么啊! 然后发现这题在网上找不到题解……那么既然A了就来骗一波访问量吧…… (然而并不怎么会用什么公式编辑器,写得丑也凑合着看吧…… ...

  6. 51Nod 快速傅里叶变换题集选刷

    打开51Nod全部问题页面,在右边题目分类中找到快速傅里叶变换,然后按分值排序,就是本文的题目顺序. 1.大数乘法问题 这个……板子就算了吧. 2.美妙的序列问题 长度为n的排列,且满足从中间任意位置 ...

  7. 《剑指offer》面试题66. 构建乘积数组

    问题描述 给定一个数组 A[0,1,-,n-1],请构建一个数组 B[0,1,-,n-1],其中 B 中的元素 B[i]=A[0]×A[1]×-×A[i-1]×A[i+1]×-×A[n-1].不能使用 ...

  8. Noip前的大抱佛脚----赛前任务

    赛前任务 tags:任务清单 前言 现在xzy太弱了,而且他最近越来越弱了,天天被爆踩,天天被爆踩 题单不会在作业部落发布,所以可(yi)能(ding)会不及时更新 省选前的练习莫名其妙地成为了Noi ...

  9. 快速数论变换NTT模板

    51nod 1348 乘积之和 #include <cmath> #include <iostream> #include <cstdio> #include &l ...

随机推荐

  1. Linux速成(一)

    全部转载自http://www.runoob.com/linux/linux-intro.html 一.Linux 简介 Linux是一套免费使用和自由传播的类Unix操作系统,是一个基于POSIX和 ...

  2. SICP读书笔记 3.5

    SICP CONCLUSION 让我们举起杯,祝福那些将他们的思想镶嵌在重重括号之间的Lisp程序员 ! 祝我能够突破层层代码,找到住在里计算机的神灵! 目录 1. 构造过程抽象 2. 构造数据抽象 ...

  3. ABP.ModuleZero.Feature——特性管理

    原文地址:http://aspnetboilerplate.com/Pages/Documents/Feature-Management  (在翻译原文的基础上增补更多细节说明) 简介 在大多数SAA ...

  4. du命令详解

    基础命令学习目录首页 原文链接:https://blog.csdn.net/linuxnews/article/details/51207738 导读du命令是检查硬盘使用情况,统计文件或目录及子目录 ...

  5. 【探路者】final贡献分配

     [探路者]组成员及各位博客地址. 1蔺依铭:http://www.cnblogs.com/linym762/ 2张恩聚:http://www.cnblogs.com/zej87/ 3米赫:http: ...

  6. 在js中保存数据

    localStorage: localStorage.setItem("key", "value"); localStorage.getItem("k ...

  7. 2-First scrum meeting-20151201

    前言 因为编译和数据库的影响,这学期的担子差点抗不起来……所以在老师的同情之下我们的第二阶段从今天开始正式开工.因为scrum meeting要求更新,所以配合其他作业,完成功能可能细化到模块部分. ...

  8. Linux基础入门--04

    目录结构及文件基本操作 实验介绍: 1.Linux 的文件组织目录结构. 2.相对路径和绝对路径. 3.对文件的移动.复制.重命名.编辑等操作. 一.Linux 目录结构 在讲 Linux 目录结构之 ...

  9. Ubuntu下tensorboard的使用

    1. 找到运行程序的事件输出路径   找到路径并进入,例如我的是在路径/home/ly/codes下: 2. 打开tensorboard服务器   在终端输入(--logdir=自己所存的路径): t ...

  10. Eclipse+MySQL+Tomcat web开发安装配置

    转载文章: 链接:https://blog.csdn.net/bbyyz01/article/details/78142126 1.Eclipse 这里选择Eclipse集成开发环境. 可以直接在官网 ...