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) + ... ...
随机推荐
- 使用oss批量上传图片
<?php set_time_limit(0);// 引入自动加载类// 确保路径是否正确require_once 'autoload.php';// 确定参数 需要申请$accessKeyId ...
- 230. Kth Smallest Element in a BST
Given a binary search tree, write a function kthSmallest to find the kth smallest element in it. Not ...
- BUTTON标签和INPUT标签的区别【转】
一句话概括主题:<button>具有<input type="button" ... >相同的作用但是在可操控性方面更加强大. HTML 4.01规范的Fo ...
- leetcode 136. Single Number ----- java
Given an array of integers, every element appears twice except for one. Find that single one. Note:Y ...
- Linux网络管理概述
概述:计算机基础知识.网络基础知识其实是所有的程序员所必须的,甚至已经不仅仅是程序员的专利,而是每一个人都应该掌握的计算机知识. 主要内容: 一.网络基础 二.Linux网络配置 三.Linux网络命 ...
- kuangbin_UnionFind D (HDU 3038)
加权并查集 似乎就是在想这题的时候突然理解了之前看E题没看懂的标准加权解法 值得注意的技巧 为了让区间之前连成树 形式设定为为(l, r] 接受l的输入后先自减一下就可以了 #include < ...
- DRL之:策略梯度方法 (Policy Gradient Methods)
DRL 教材 Chpater 11 --- 策略梯度方法(Policy Gradient Methods) 前面介绍了很多关于 state or state-action pairs 方面的知识,为了 ...
- Opencv 3入门(毛星云)摘要
第一章 环境搭建: 1. 环境变量path 添加 D:\Program Files\opencv\build\x86\vc11\bin 2. VS在VC++项目中,属性管理器\属性. VC++目 ...
- 写EXCEL(csv 可以用EXECEL打开,逗号分列隔符)
FILE *file = NULL; char path[]="D:\\Data\\Pos.csv"; CTime m_tDateTime; m_tDateTime = m_tDa ...
- HTTP 错误 500.19 - Internal Server Error 无法访问请求的页面,因为该页的相关配置数据无效。
HTTP 错误 500.19 - Internal Server Error 无法访问请求的页面,因为该页的相关配置数据无效. 详细错误信息模块 IIS Web Core 通知 BeginReques ...