[模板] NTT快速数论变换

17人阅读 评论(0) 收藏 举报
分类:

题目分析:

emmm,求两个多项式卷积

题目分析:

FFT能做哇,然而精度和速度…
NTT相对于FFT就是变换了原根。
本博客木有讲解,只有板子qwq

题目链接:

UOJ #34
Luogu 3803

Ac 代码:

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cmath>
#define ll long long
const int maxm=3e6+100,mod=998244353,g=3,gi=332748118;
inline ll fastpow(ll x,int y)
{
    ll ans=1;
    for(;y;y>>=1,x=(x*x)%mod)
     if(y&1) ans=(ans*x)%mod;
    return ans%mod;
} 
int n,m,len;
ll inv,A[maxm],B[maxm],rev[maxm];
inline void NTT(ll *a,int f)
{
    for(int i=0;i<n;i++) if(i<rev[i]) std::swap(a[i],a[rev[i]]);
    for(int i=1;i<n;i<<=1)
    {
        ll wn=fastpow((f==1)?g:gi,(mod-1)/(i<<1));
        for(int j=0;j<n;j+=(i<<1))
        {
            ll w=1;
            for(int k=0;k<i;k++,w=(w*wn)%mod)
            {
                ll x=a[j+k],y=(w*a[i+j+k])%mod;
                a[j+k]=(x+y)%mod;
                a[i+j+k]=(x-y+mod)%mod;
            }
        }
    }
    if(f==-1)
     for(int i=0;i<n;i++) a[i]=(a[i]*inv)%mod;
}
int main()
{
    scanf("%d%d",&n,&m);
    for(int i=0;i<=n;i++) scanf("%lld",&A[i]),A[i]=(A[i]+mod)%mod;
    for(int i=0;i<=m;i++) scanf("%lld",&B[i]),B[i]=(B[i]+mod)%mod;
    m+=n;
    for(n=1;n<=m;n<<=1) len++;
    inv=fastpow(n,mod-2);
    for(int i=0;i<n;i++) rev[i]=(rev[i>>1]>>1)|((i&1)<<(len-1));
    NTT(A,1),NTT(B,1);
    for(int i=0;i<n;i++) A[i]=(A[i]*B[i]+mod)%mod;
    NTT(A,-1);
    for(int i=0;i<=m;i++) printf("%lld ",A[i]);
    return 0;
}
查看评论

快速数论变换模板(NTT)

快速数论变化(NTT)是的原理其实和快速傅里叶变换是一样的原理。 对于形如m= c*2^n+1的费马素数,假设其原根为g。那么瞒住g^(m-1)==1  而且正好(m-1)能整除2^n的。所所以可以在...
  • u012127882
  • u012127882
  • 2015-07-31 20:32:47
  • 2219

【模板】快速数论变换ntt(long long版)

快速数论变换ntt(long long版) const LL P = 50000000001507329LL; //190734863287 * 2 ^ 18 + 1 //const int P...
  • Summer_via
  • Summer_via
  • 2016-10-13 09:04:10
  • 405

快速傅里叶变换(FFT)和数论变换(NTT)模板

#include #define ll long long #define dob complex const int N=120010; const double pi=acos(-1.0); us...
  • pan1197349032
  • pan1197349032
  • 2016-09-04 15:39:21
  • 622

快速数论变换(NTT)

FFT的复数精度问题让我很不爽,很早
  • zz_1215
  • zz_1215
  • 2014-10-24 16:58:29
  • 12540

快速数论变换(NTT)

题面很简单,就懒得贴了,那不是我要说的重点。 重点是NTT,也称快速数论变换。 在很多问题中,我们可能会遇到在模意义下的多项式乘法问题,这时传统的快速傅里叶变换可能就无法满足要求,这时候快速数论变...
  • Starry__Night
  • Starry__Night
  • 2015-07-08 20:29:49
  • 2686

[NTT] 快速数论变换学习笔记

FNT和NTT都是快速数论变换
  • HeRaNO
  • HeRaNO
  • 2017-05-05 23:22:28
  • 1804

NTT(快速数论变换)模板

例题: HDU 1402#include #include #include #include #include using namespace std; const double PI =...
  • qingshui23
  • qingshui23
  • 2017-06-14 12:53:39
  • 379

NTT(快速数论变换)用到的各种素数及原根

g是mod(r * 2 ^ k + 1)的原根 r * 2 ^ k + 1 r k g 3 1 1 2 5 1 2 2 17 ...
  • hnust_xx
  • hnust_xx
  • 2017-08-02 11:06:38
  • 693

快速数论变换(NTT)——学习笔记

NTT 嗷, 很简单。 FFTFFTFFT 之所以能加速,是由于有主n次单位根 wn=e2πinwn=e2πinw_n=e^{\frac{2\pi i}{n}} ,的那些很好的性质。而在自然数域,...
  • CHHNZ
  • CHHNZ
  • 2018-02-08 21:30:20
  • 99

hdu5829快速数论变换以及任意模数的拓展!!!

写的时候要些变换主要就是抓住1.明白自变量的范围。2.两个自变量的和是一个常数。3.长度时大于等于实际的二倍的。 还有这题网上大多数的题目推导都是有问题的(导致常数过大,推导是正确的),或者有些小哥的...
  • guoshiyuan484
  • guoshiyuan484
  • 2017-08-18 23:40:20
  • 315
    个人资料
    持之以恒
    等级:
    访问量: 6万+
    积分: 7046
    排名: 4097
    文章分类
    最新评论