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) + ... ...
随机推荐
- 建造模式Builder
建造模式Builder /** * 抽象建造者 */ public abstract class Builder { public abstract void buildPart1(); public ...
- Git 基础学习篇(应用-windows篇)
此篇教程主要是讲应用,因为理论,,,额,我也说不出来.大家要深入学习还是看廖老师的教程吧. 可以把这篇当作一个简单应用的参考,因为当初看廖老师的也难看啊!!! 以下是资料: 廖雪峰-Git教程 [Gi ...
- 初识vi编辑器
vi基本概念既不介绍了,百度,wiki上都有.下面稍微总结下我所学的vi吧 1.vi分为三种状态:命令模式(command mode);插入模式(insert mode);底行模式(last line ...
- 高效而轻松的sed命令
sed(stream editor)是一款高效的流编辑器,它一次只处理一行内容,处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”(pattern space),接着用sed命令处理缓冲区中的 ...
- map遍历的四种方法
public static void main(String[] args) { Map<String, String> map = new HashMap<String, Stri ...
- uva624 CD 01背包+输出最优解
link:http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem& ...
- html5表单新特性
type=range 值区域范围 默认值(0-100) type=data 选择日期 type=color value='初始值' 颜色选择器控件 type=search 搜索框效果 type=im ...
- leetcode 109 Convert Sorted List to Binary Search Tree ----- java
Given a singly linked list where elements are sorted in ascending order, convert it to a height bala ...
- Windows7下QT5开发环境搭建 分类: QT开发 2015-03-09 23:44 65人阅读 评论(0) 收藏
Windows7下QT开法环境常见搭配方法有两种. 第一种是:QT Creator+QT SDK: 第二种是:VS+qt-vs-addin+QT SDK: 以上两种均可,所需文件见QT社区,QT下载地 ...
- spring源码学习之:spring容器的applicationContext启动过程
Spring 容器像一台构造精妙的机器,我们通过配置文件向机器传达控制信息,机器就能够按照设定的模式进行工作.如果我们将Spring容器比喻为一辆汽车,可以将 BeanFactory看成汽车的发动机, ...