51nod 1348 乘积之和

#include <cmath>
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <algorithm>
#include <queue>
#include <map>
#include <bitset>
#include <set>
const int maxlongint=2147483647;
const long long mo=100003;
const int N=300005;
using namespace std;
long long mod[2]={998244353,1004535809},M=mod[0]*mod[1];
long long f[N],g[N],f1[N],g1[N],h[22][N],W[2][N],ny;
int a[N],n,q;
long long poww(long long x,int y,int z)
{
long long s=1;
for(;y;y>>=1,x=x*x%mod[z])
if(y&1) s=s*x%mod[z];
return s;
}
long long mul(long long x,int y)
{
long long s=0;
for(;y;y>>=1,x=(x+x)%M)
if(y&1) s=(s+x)%M;
return s;
}
void NTT(long long *f,int len,int type,int z)
{
for(int i=0,p=0;i<len;i++)
{
if(i<p) swap(f[i],f[p]);
for(int j=len>>1;(p^=j)<j;j>>=1);
}
for(int i=2;i<=len;i<<=1)
{
int half=i>>1,pe=len/i;
for(int j=0;j<half;j++)
{
long long w=!type?W[z][pe*j]:W[z][len-pe*j];
for(int k=j;k<len;k+=i)
{
long long x=f[k],y=w*f[k+half]%mod[z];
f[k]=(x+y)%mod[z],f[k+half]=(x-y+mod[z])%mod[z];
}
}
}
if(type)
{
ny=poww(len,mod[z]-2,z);
for(int i=0;i<len;i++) f[i]=f[i]*ny%mod[z];
}
}
long long CRT(int i)
{
long long x0=poww(mod[1],mod[0]-2,0),x1=poww(mod[0],mod[1]-2,1);
return (mul(f[i]*mod[1]%M,x0%M)+mul(f1[i]*mod[0]%M,x1%M))%M%mo;
}
void dc(int l,int r,int deep)
{
if(l==r)
{
h[deep][0]=1,h[deep][1]=a[l]%mo;
return;
}
int mid=(l+r)>>1,fn;
for(fn=1;fn<=r-l+1;fn<<=1); dc(l,mid,deep+1); for(int i=0;i<fn;i++) h[deep][i]=h[deep+1][i],h[deep+1][i]=0; dc(mid+1,r,deep+1); W[0][0]=W[1][0]=1,W[0][1]=poww(3,(mod[0]-1)/fn,0),W[1][1]=poww(3,(mod[1]-1)/fn,1);
for(int i=2;i<=fn;i++) W[0][i]=W[0][i-1]*W[0][1]%mod[0],W[1][i]=W[1][i-1]*W[1][1]%mod[1]; for(int i=0;i<fn;i++) f[i]=f1[i]=g[i]=g1[i]=0;
for(int i=0;i<=mid-l+1;i++) f[i]=f1[i]=h[deep][i];
for(int i=0;i<fn;i++) h[deep][i]=0;
for(int i=0;i<=r-mid;i++) g[i]=g1[i]=h[deep+1][i];
for(int i=0;i<fn;i++) h[deep+1][i]=0; NTT(f,fn,0,0),NTT(f1,fn,0,1);
NTT(g,fn,0,0),NTT(g1,fn,0,1);
for(int i=0;i<fn;i++) f[i]=f[i]*g[i]%mod[0],f1[i]=f1[i]*g1[i]%mod[1];
NTT(f,fn,1,0),NTT(f1,fn,1,1); for(int i=0;i<fn;i++) h[deep][i]=CRT(i);
}
int main()
{
scanf("%d%d",&n,&q);
for(int i=1;i<=n;i++) scanf("%d",&a[i]);
dc(1,n,0);
for(int x;q--;)
{
scanf("%d",&x);
printf("%lld\n",h[0][x]);
}
}

快速数论变换NTT模板的更多相关文章

  1. Algorithm: 多项式乘法 Polynomial Multiplication: 快速傅里叶变换 FFT / 快速数论变换 NTT

    Intro: 本篇博客将会从朴素乘法讲起,经过分治乘法,到达FFT和NTT 旨在能够让读者(也让自己)充分理解其思想 模板题入口:洛谷 P3803 [模板]多项式乘法(FFT) 朴素乘法 约定:两个多 ...

  2. 【算法】快速数论变换(NTT)初探

    [简介] 快速傅里叶变换(FFT)运用了单位复根的性质减少了运算,但是每个复数系数的实部和虚部是一个余弦和正弦函数,因此系数都是浮点数,而浮点数的运算速度较慢且可能产生误差等精度问题,因此提出了以数论 ...

  3. 模板 - 数学 - 多项式 - 快速数论变换/NTT

    Huffman分治的NTT,常数一般.使用的时候把多项式的系数们放进vector里面,然后调用solve就可以得到它们的乘积.注意这里默认最大长度是1e6,可能需要改变. #include<bi ...

  4. [快速数论变换 NTT]

    先粘一个模板.这是求高精度乘法的 #include <bits/stdc++.h> #define maxn 1010 using namespace std; char s[maxn]; ...

  5. JZYZOJ 2041 快速数论变换 NTT 多项式

    http://172.20.6.3/Problem_Show.asp?id=2041 https://blog.csdn.net/ggn_2015/article/details/68922404 代 ...

  6. 快速数论变换(NTT)小结

    NTT 在FFT中,我们需要用到复数,复数虽然很神奇,但是它也有自己的局限性--需要用double类型计算,精度太低 那有没有什么东西能够代替复数且解决精度问题呢? 这个东西,叫原根 原根 阶 若\( ...

  7. 从傅里叶变换(FFT)到数论变换(NTT)

    FFT可以用来计算多项式乘法,但是复数的运算中含有大量的浮点数,精度较低.对于只有整数参与运算的多项式,有时,\(\text{NTT(Number-Theoretic Transform)}\)会是更 ...

  8. 多项式 之 快速傅里叶变换(FFT)/数论变换(NTT)/常用套路【入门】

    原文链接https://www.cnblogs.com/zhouzhendong/p/Fast-Fourier-Transform.html 多项式 之 快速傅里叶变换(FFT)/数论变换(NTT)/ ...

  9. 「算法笔记」快速数论变换(NTT)

    一.简介 前置知识:多项式乘法与 FFT. FFT 涉及大量 double 类型数据操作和 \(\sin,\cos\) 运算,会产生误差.快速数论变换(Number Theoretic Transfo ...

随机推荐

  1. nginx 报错:[crit] 12456#0: *5 SSL_do_handshake() failed (SSL: error:1408A0A0:SSL routines:SSL3_GET_CLIENT_HELLO

    解决方法: 将配置 listen ssl; 更换为: listen ; ssl on; 从版本1.15.0开始,ssl on; 指令被废弃,使用 listen 443 ssl; 代替. 具体查看官网: ...

  2. Linux系列(0):入门之Linux版本说明以及用户登录与切换

    你知道你登录时所在目录吗? 知道根目录下有哪些子目录吗? 知道如何切换用户吗? 知道如何添加用户吗? 如果你不知道,那就可以了解一下本章节啦! 前言:你知道Linux有多少发行版吗,如下图所示: 1. ...

  3. Forest Program(dfs方法---树上的环)

    题意:http://acm.hdu.edu.cn/showproblem.php?pid=6736 沙漠中的每一个连通块都是一棵仙人掌:一个连通块是一棵仙人掌当且仅当连通块中不存在重边和自环,并且每一 ...

  4. CSS基础布局

    目录 css基础布局 1.布局相关的标签 2.盒子模型 2-1 什么是盒子模型 2-2 块级元素和内联元素(行内元素) 2-3 盒子模型之间的关系 盒子模型相关CSS属性 3.浮动 3-1 什么是浮动 ...

  5. 流程控制之 for 循环

    目录 流程控制之for循环 for 循环条件语句 for 循环的嵌套 流程控制之for循环 for 循环条件语句 for i in range(3): print(i) # 0 # 1 # 2 for ...

  6. Java中的自动拆装箱(转)

    出处: 一文读懂什么是Java中的自动拆装箱 本文主要介绍Java中的自动拆箱与自动装箱的有关知识.  基本数据类型 基本类型,或者叫做内置类型,是Java中不同于类(Class)的特殊类型.它们是我 ...

  7. 贝叶斯线性回归(Bayesian Linear Regression)

    贝叶斯线性回归(Bayesian Linear Regression) 2016年06月21日 09:50:40 Duanxx 阅读数 54254更多 分类专栏: 监督学习   版权声明:本文为博主原 ...

  8. 【IntelliJ IDEA】快捷键

    1.System.out.println();的快捷方法 sout然后Alt+Enter或者直接点 2.idea上 重写父类方法的快捷键 Ctrl+O之后,在弹出的上面选择要重写的方法 3.idea ...

  9. dev grid的一些使用

    保留选中数据,其他数据删除,不操作数据库 private void butnoremove_Click(object sender, EventArgs e) { int iSelectRowCoun ...

  10. VC++ warning C4819 的解决方法(转)

    编译VC++程序的时候出现如下提示警告: warning C4819: The file contains a character that cannot be represented in the ...