题目链接

戳我

题意简述

你有长为\(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. Float浮点数的使用和条件

    在这里简单的说一下,我对浮点数的理解,可能说的比较浅,老师也没有说,只是略微的提了一下,完全是我自己个人的理解. 我觉得float浮点数的用法和int的用法有些雷同,浮点数用于计算小数点单位,我们先可 ...

  2. 基于Redis实现分布式锁(续)

    代码实现: redis实现分布式锁(lock:通过间隔时间段去请求Redis,来实现阻塞占用,一直到获取锁,或者超时. unlock:删除redis中key)

  3. 算法工程师进化-SQL

    1 引言 SQL操作往往是程序员必备的技能,对于算法工程师而言,熟练掌握SQL操作则更为重要.本文以<SQL语句执行顺序>作为学习资料,总结SQL的理论部分. 2 SQL查询语句的执行顺序 ...

  4. Hbase RESTFul API创建namespace返回500

    1.使用官方提供的/namespaces/namespace创建namespace失败,返回500,官方提供示例:/namespaces/namespace POST 创建一个新的namespace. ...

  5. markdown | Latex | 书写测试

    我永远喜欢markdown! 建图 graph TD; 1-->2 1-->3 1-->4 2-->5 2-->6 3-->7 3-->8 4-->9 ...

  6. VMware启动Centos时出现错误Cannot open the disk 'xxxxxxx.vmdk' or one of the snapshot disks it depends on. .

    今天拔装虚拟机的硬盘的时候,没有关掉虚拟机,导致虚拟打开的时候出现:Cannot open the disk 'xxxxxxx.vmdk' or one of the snapshot disks i ...

  7. Bootstrap学习--栅格系统

    响应式布局页面:即同一套页面可以兼容不同分辨率的设备. Bootstrap依赖于栅格系统实现响应式布局,将一行均分为12个格子,可以指定元素占几个格子. 实现过程 1.定义容器,相当于之前的table ...

  8. PHP--面向对象的设计原则

    三大特性是:封装.继承.多态 所谓封装,也就是把客观事物封装成抽象的类,并且类可以把自己的数据和方法只让可信的类或者对象操作,对不可信的进行信息隐藏. 封装是面向对象的特征之一,是对象和类概念的主要特 ...

  9. Scrum Meeting 11.11

    成员 今日任务 明日计划 用时 徐越 学习UI设计并重构上传下载界面     赵庶宏       薄霖 UI代码更新     卞忠昊 Xfermode与PorterDuff     武鑫 界面设计:独 ...

  10. PHPCMS之 列表和内容页

    上一篇随笔中降到了一些相似的语法可以来后台管理网页的内容,下面就是关于列表的管理 加入一级栏目中有几个有二级菜单的,那么就可以把相应的界面建立一个副本,然后修改里面栏目的一些属性 {pc:conten ...