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) + ... ...
随机推荐
- Java 父类和子类
package chapter11; public class GeometricObject1 { private String color="white"; private b ...
- Bootstrap部分---环境安装及一个可视化的布局;
一:环境安装*****顺序不可变***** <head> 如果需要可以设定,移动设备优先 <meta name="viewport" content=" ...
- System program problem detected 解决
每次开机都出现:System program problem detected 管理员权限打开:/etc/default/apport su root vim /etc/default/app ...
- java parseint()
static int parseInt(String s) static int parseInt(String s, int radix) parseInt(String s)表示将 “数字” 转换 ...
- zoj3261 带权并查集
题意:有很多颗星球,各自有武力值,星球间有一些联系通道,现在发生战争,有一些联系通道会被摧毁,而一些星球会通过还没有被摧毁的联系通道直接或者间接联系能够联系到的武力值最高的星球求救,如果有多个武力值都 ...
- 嵌入式Linux C笔试题积累(转)
http://blog.csdn.net/h_armony/article/details/6764811 1. 嵌入式系统中断服务子程序(ISR) 中断是嵌入式系统中重要的组成部分,这导致了很 ...
- Java——网络编程
// TODO Auto-generated method stub //获取本地主机IP对象 InetAddress ip = InetAddress.getLocalHost(); Syst ...
- Twsited异步网络框架
Twisted是一个事件驱动的网络框架,其中包含了诸多功能,例如:网络协议.线程.数据库管理.网络操作.电子邮件等. Twisted介绍:http://blog.csdn.net/hanhuili/a ...
- 【转】win7 uac关闭
方法1: 原文网址:http://jingyan.baidu.com/article/c275f6bae2650ce33d756795.html 首先点击开始,并在输入框中输入“MSCONFIG”,打 ...
- ps色阶
三原色