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较小,每次卷积后答案上界大约为1e16,用ntt在两个1e9左右的模数下计算后CRT合并即可,复杂度为O(nlog2n),要注意常数优化
#include<cstdio>
#include<cstring>
#include<algorithm>
typedef long long i64;
int _(){
int x=,f=,c=getchar();
while(c<)c=='-'&&(f=-),c=getchar();
while(c>)x=x*+c-,c=getchar();
return x*f;
}
int pow(int a,int n,int p){
int v=;
for(;n;n>>=){
if(n&)v=i64(v)*a%p;
a=i64(a)*a%p;
}
return v;
}
i64 mul(i64 a,i64 b,i64 p){
i64 s=;
a%=p;b%=p;
while(b){
if(b&)(s+=a)%=p;
(a<<=)%=p;
b>>=;
}
return s;
}
int N,X,r[];
template<const int p,const int g>
void ntt(int*a,int t){
for(int i=;i<N;++i)if(i>r[i])std::swap(a[i],a[r[i]]);
for(int i=;i<N;i<<=){
int w=pow(g,(t*(p-)/(i*)+p-),p);
for(int j=;j<N;j+=i<<){
int e=,*b=a+j,*c=b+i;
for(int k=;k<i;++k,e=i64(e)*w%p){
int x=b[k],y=c[k]*i64(e)%p;
b[k]=(x+y)%p;
c[k]=(x-y+p)%p;
}
}
}
if(t==-){
i64 I=pow(N,p-,p);
for(int i=;i<N;++i)a[i]=a[i]*I%p;
}
}
int n,q,v0[],mem[*+],*mp=mem,vs[][+];
const int p1=,g1=,p2=,g2=;
const i64 m1=i64(p1)*pow(p1,p2-,p2),m2=i64(p2)*pow(p2,p1-,p1),ps=i64(p1)*p2;
int*calc(int L,int R){
int*pos=mp;mp+=R-L+;
if(L==R){
*pos=v0[L];
return pos;
}
int M=L+R>>;
int*lp=calc(L,M)-;
int*rp=calc(M+,R)-;
for(N=,X=;N<R-L+;N<<=,++X);
if(R-L+<=){
for(int i=;i<;++i)memset(vs[i],,N*sizeof(int)),vs[i][]=;
for(int i=;i<=M-L+;++i)vs[][i]=lp[i];
for(int i=;i<=R-M;++i)vs[][i]=rp[i];
for(int i=;i<=R-L+;++i){
for(int j=;j<=i;++j)pos[i-]=(pos[i-]+i64(vs[][j])*vs[][i-j])%;
}
return pos;
}
for(int i=;i<N;++i)r[i]=r[i>>]>>|(i&)<<X;
for(int i=;i<;++i)memset(vs[i],,N*sizeof(int)),vs[i][]=;
for(int i=;i<=M-L+;++i)vs[][i]=vs[][i]=lp[i];
for(int i=;i<=R-M;++i)vs[][i]=vs[][i]=rp[i];
ntt<p1,g1>(vs[],);
ntt<p1,g1>(vs[],);
ntt<p2,g2>(vs[],);
ntt<p2,g2>(vs[],);
for(int i=;i<N;++i)vs[][i]=i64(vs[][i])*vs[][i]%p1;
for(int i=;i<N;++i)vs[][i]=i64(vs[][i])*vs[][i]%p2;
ntt<p1,g1>(vs[],-);
ntt<p2,g2>(vs[],-);
for(int i=;i<=R-L+;++i)pos[i-]=(mul(m2,vs[][i],ps)+mul(m1,vs[][i],ps))%ps%;
return pos;
}
int main(){
n=_();q=_();
for(int i=;i<=n;++i)v0[i]=_();
int*ans=calc(,n)-;
while(q--)printf("%d\n",ans[_()]);
return ;
}
51nod 1348 乘积之和的更多相关文章
- 51nod 1238 最小公倍数之和 V3
51nod 1238 最小公倍数之和 V3 求 \[ \sum_{i=1}^N\sum_{j=1}^N lcm(i,j) \] \(N\leq 10^{10}\) 先按照套路推一波反演的式子: \[ ...
- 51nod乘积之和
题目链接 戳我 题意简述 你有长为\(n\)的序列和\(Q\)个询问,每次询问一个\(k\),求用\(k\)个数组成的不同方案的乘积的和. sol 显然要预处理一波. 考虑分治,左右两边都求出来后,怎 ...
- 51nod 1225 余数之和 数论
1225 余数之和 题目连接: http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1225 Description F(n) ...
- 51Nod 1225 余数之和 —— 分区枚举
题目链接:http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1225 1225 余数之和 基准时间限制:1 秒 空间限制:1 ...
- 51Nod 1110 距离之和最小 V3 中位数 思维
基准时间限制:1 秒 空间限制:131072 KB 分值: 40 难度:4级算法题 X轴上有N个点,每个点除了包括一个位置数据X[i],还包括一个权值W[i].点P到点P[i]的带权距离 = 实际距离 ...
- 51Nod 1108 距离之和最小 V2 1096 距离之和最小 中位数性质
1108 距离之和最小 V2基准时间限制:1 秒 空间限制:131072 KB 分值: 40 难度:4级算法题 收藏 关注三维空间上有N个点, 求一个点使它到这N个点的曼哈顿距离之和最小,输出这个最小 ...
- 51NOD 1220 约数之和 [杜教筛]
1220 约数之和 题意:求\(\sum_{i=1}^n \sum_{j=1}^n \sigma_1(ij)\) \[ \sigma_0(ij) = \sum_{x\mid i}\sum_{y\mi ...
- 51NOD 1238 最小公倍数之和 V3 [杜教筛]
1238 最小公倍数之和 V3 三种做法!!! 见学习笔记,这里只贴代码 #include <iostream> #include <cstdio> #include < ...
- 51Nod 1225 余数之和 [整除分块]
1225 余数之和 基准时间限制:1 秒 空间限制:131072 KB 分值: 80 难度:5级算法题 收藏 关注 F(n) = (n % 1) + (n % 2) + (n % 3) + ... ...
随机推荐
- 动态数组 - ArrayList
前言 如果数组的大小要随时间变化,那么数组操作起来就比较麻烦. 在C++中,这种情况要用到动态向量Vector. 而Java中,提供了一种叫做ArrayList的泛型数组结构类型,提供相似的作用. 其 ...
- Redis的初步安装
Redis是一个开源的使用ANSI C语言编写.支持网络.可基于内存亦可持久化的日志型.Key-Value数据库,并提供多种语言的API. 下载 官网下载:http://redis.io/downlo ...
- Ionic基础——侧边栏ion-side-menus 以及ion-tap结合侧边栏详解
一. 侧边栏菜单 : ion-side-menus 侧边栏菜单是一个最多包含三个子容器的元素: 默认情况下,侧边栏菜单将只显示ion-side-menu-content容器的内容. 向左滑动时,将显示 ...
- 2016 Sichuan Province Programming Contest
2016 Sichuan Province Programming Contest 代码 2016 Sichuan Province Programming Contest A. Nearest Ne ...
- LOAD TABLE tbl_name FROM MASTER语法 SQL
用于把表的拷贝从主服务器转移到从属服务器.本语句的主要作用是调试LOAD DATA FROM MASTER.它要求用于连接主服务器的帐户拥有对主服务器的RELOAD和SUPER权限,并拥有对要载入的主 ...
- spark共享变量
boradcast例子代码: scala版本 spark共享变量之Accumulator 例子代码: scala版本
- 关于kafka连接不上别的机器问题Connection refused
1.确认config里面的server.properties 正确(包括IP+端口2181记得看清,用hostname的话记得etc/hostnames下面查看全部配置上没,建议用hostname方便 ...
- click 绑定(三)防止事件冒泡
防止事件冒泡 默认情况下,Knockout允许click事件继续在更高一层的事件句柄上冒泡执行.例如,如果你的元素和父元素都绑定了click事件,那当你点击该元素的时候两个事件都会触发的.如果需要, ...
- 黑马程序员——JAVA基础之List集合
------- android培训.java培训.期待与您交流! ---------- Collection : |--List:元素是有序的,元素可以重复.因为该集合体系有索引. | ...
- awesome-very-deep-learning
awesome-very-deep-learning is a curated list for papers and code about implementing and training ver ...