今天的A题。裸的ntt,但我不会,于是白送了50分。

于是跑来学一下ntt。

题面非常easy。就懒得贴了,那不是我要说的重点。

重点是NTT,也称高速数论变换。

在非常多问题中,我们可能会遇到在模意义下的多项式乘法问题,这时传统的高速傅里叶变换可能就无法满足要求,这时候高速数论变换就派上了用场。

考虑高速傅里叶变换的实现,利用单位复根的特殊性质来降低运算。而利用的。就是dft变换的循环卷积特性。

于是考虑在模意义下相同具有循环卷积特性的东西。

考虑在模p意义下(p为特定的质数,满足p=c∗2n+1)

我们令p的一个原根为g,于是类比fft,我们的单位根为gp−1n,然后其他的处理都类比fft。

UPD:这是uoj34的代码

#include <bits/stdc++.h>

using namespace std;

typedef long long ll;
typedef double db; const int inf=0x3f3f3f3f; int getint()
{
int f=1,g=0;char c=getchar();
while(c<'0' || c>'9'){if(c=='-')f=-1;c=getchar();}
while(c>='0' && c<='9')g=(g<<3)+(g<<1)+c-'0',c=getchar();
return f*g;
} const int maxn=300005;
const int mod=998244353; const int G=3; int a[maxn];
int b[maxn];
int c[maxn];
int n,m;
int rev[maxn];
int N;
int len;
int inv; int power(ll x,ll y)
{
ll res=1ll;
for(;y;y>>=1,x=(x*x)%mod)
{
if(y&1)res=(res*x)%mod;
}
return res;
} void init()
{
while((n+m)>=(1<<len))len++;
N=(1<<len);
inv=power(N,mod-2);
for(int i=0;i<N;i++)
{
int pos=0;
int temp=i;
for(int j=1;j<=len;j++)
{
pos<<=1;pos |= temp&1;temp>>=1;
}
rev[i]=pos;
}
} void ntt(int *a,int n,int re)
{
for(int i=0;i<n;i++)
{
if(rev[i]>i)
{
swap(a[i],a[rev[i]]);
}
}
for(int i=2;i<=n;i<<=1)
{
int mid=i>>1; int wn=power(G,(mod-1)/i);
if(re) wn=power(wn,(mod-2));
for(int j=0;j<n;j+=i)
{
int w=1;
for(int k=0;k<mid;k++)
{
int temp1=a[j+k];
int temp2=(ll)a[j+k+mid]*w%mod;
a[j+k]=(temp1+temp2);if(a[j+k]>=mod)a[j+k]-=mod;
a[j+k+mid]=(temp1-temp2);if(a[j+k+mid]<0)a[j+k+mid]+=mod;
w=(ll)w*wn%mod;
}
}
}
if(re)
{
for(int i=0;i<n;i++)
{
a[i]=(ll)a[i]*inv%mod;
}
}
} int main()
{
n=getint();
m=getint(); for(int i=0;i<=n;i++)
{
a[i]=getint();
}
for(int i=0;i<=m;i++)
{
b[i]=getint();
} init(); ntt(a,N,0);
ntt(b,N,0);
for(int i=0;i<=N;i++)
{
c[i]=(ll)a[i]*b[i]%mod;
}
ntt(c,N,1);
for(int i=0;i<=n+m;i++)
{
printf("%d%c",c[i]," \n"[i==n+m]);
} return 0;
}

高速数论变换(NTT)的更多相关文章

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

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

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

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

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

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

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

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

  5. 快速傅里叶变换FFT& 数论变换NTT

    相关知识 时间域上的函数f(t)经过傅里叶变换(Fourier Transform)变成频率域上的F(w),也就是用一些不同频率正弦曲线的加 权叠加得到时间域上的信号. \[ F(\omega)=\m ...

  6. [快速数论变换 NTT]

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

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

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

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

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

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

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

随机推荐

  1. python第三次作业——叶耀宗

    作业1 import random#引入随机数模块xing=["小白","小黄","小王","小陈","小绿& ...

  2. CMSIS-RTOS功能概述

    以下列表简要概述了所有CMSIS-RTOS功能.标有$的函数是可选的.特定的CMSIS-RTOS实现可能无法提供所有功能,但osFeatureXXXX定义明确指出了这一点. 注意 RTX实现不支持的功 ...

  3. 隐马尔科夫模型(HMM)

    基本概念 1Markov Models 2Hidden Markov Models 3概率计算算法前向后向算法 1-3-1直接计算 1-3-2前向算法 1-3-3后向算法 4学习问题Baum-Welc ...

  4. Hive的单节点集群详细启动步骤

    说在前面的话, 在这里,推荐大家,一定要先去看这篇博客,如下 再谈hive-1.0.0与hive-1.2.1到JDBC编程忽略细节问题 Hadoop Hive概念学习系列之hive三种方式区别和搭建. ...

  5. JAVA线程队列BlockingQueue

    JAVA线程队列BlockingQueue 介绍 BlockingQueue阻塞队列,顾名思义,首先它是一个队列,通过一个共享的队列,可以使得数据由队列的一端输入,从另外一端输出. 常用的队列主要有以 ...

  6. 设计兼容不同的屏幕尺寸的Android界面

    Android的屏幕类型有几百种不同的尺寸,从小型的手机到大型的电视机.因此要使我们的应用程序兼容不同屏幕尺寸,才可以让我们的应用提供给更多的用户使用. 一.支持不同的屏幕尺寸 1.使用"w ...

  7. 超级硬件代理解决企业Web提速上网问题

    超级硬件代理解决企业Web提速上网问题 需求分析: XX集团是五家企业重组建立的特大型工程勘察设计咨询企业,下设10多个分公司,上网人数众多.有多台WEB server,对外服务,访问量及大.以前无论 ...

  8. ES6学习笔记(三)字符串的扩展

    ES6 加强了对 Unicode 的支持,并且扩展了字符串对象. 1.字符的Unicode表示法 JavaScript 允许采用\uxxxx形式表示一个字符,其中xxxx表示字符的 Unicode 码 ...

  9. js垃圾回收机制理解

    原理 找到不再被使用的变量,然后释放其占用的内存,但这个过程不是时时的,因为其开销比较大, 所以垃圾回收器会按照固定时间间隔周期性的执行 回收方式 a.标记清除 当变量进入环境时,将这个变量标记为“进 ...

  10. 洛谷 P1581 A+B Problem(升级版)

    P1581 A+B Problem(升级版) 题目背景 小明这在写作业,其中有一道A+B Problem ,他想啊想啊想,就是想不出来,于是就找到了会编程的你...... 题目描述 这里的A+B是很奇 ...