不说别的。

这份NTT跑得比FFT快,不知道为什么。

以下代码针对\(10^5\)的数据范围。

#include<cstdio>
#include<vector>
#include<algorithm>
#include<cstring>
using namespace std;
inline int read() {
    int a = 0, c = getchar(), w = 1;
    for(; c < '0' || c > '9'; c = getchar()) if(c == '-') w = -1;
    for(; c >= '0' && c <= '9'; c = getchar()) a = a * 10 + c - '0';
    return a * w;
}

const int md = 998244353, gmd = 3;
inline int add(int x, int y) {
    x += y;
    return x >= md ? x - md : x;
}
inline void Add(int& x, int y) {
    x += y;
    if(x >= md) x -= md;
}
inline int sub(int x, int y) {
    x -= y;
    return x < 0 ? x + md : x;
}
inline int mul(int x, int y) {
    return (long long)x*y%md;
}
inline int qpow(int a, int x) {
    int ret = 1;
    while(x) {
        if(x&1) ret = mul(ret, a);
        a = mul(a, a);
        x >>= 1;
    }
    return ret;
}
inline int inv(int x) {
    return qpow(x, md-2);
}

const int maxn = 1<<17;
int w[2][1<<19], invn[1<<18];
void nttinit() {
    for(int i = 0; i <= 18; i++) {
        w[1][1<<i] = w[0][1<<i] = 1;
        int wn = qpow(gmd, (md-1)/(1<<i+1)), invwn = inv(wn);
        for(int j = (1<<i)+1; j < 1<<i+1; j++) {
            w[1][j] = mul(w[1][j-1], wn);
            w[0][j] = mul(w[0][j-1], invwn);
        }
    }
    for(int i = 1; i <= 1<<18; i <<= 1) invn[i] = inv(i);
}
void ntt(int a[], int n, bool typ) {
    for(int i = 1, j = n>>1; i < n; i++) {
        if(i < j) swap(a[i], a[j]);
        for(int k = n>>1; (j^=k) < k; k >>= 1);
    }
    for(int i = 1; i < n; i <<= 1) for(int j = 0; j < n; j += i<<1) for(int k = 0; k < i; k++) {
        int u = a[j+k], v = mul(w[typ][i+k], a[j+i+k]);
        a[j+k] = add(u, v);
        a[j+i+k] = sub(u, v);
    }
    if(!typ) for(int i = 0; i < n; i++) a[i] = mul(a[i], invn[n]);
}
int tmp[maxn<<1];
void Mul(int a[], int an, int b[], int bn) {
    if(an <= 48 || bn <= 48) {
        memset(tmp, 0, (an+bn-1)*sizeof(int));
        for(int i = 0; i < an; i++) for(int j = 0; j < bn; j++) Add(tmp[i+j], mul(a[i], b[j]));
        memcpy(a, tmp, (an+bn-1)*sizeof(int));
        return;
    }
    int n = 1;
    while(n < an+bn-1) n <<= 1;
    ntt(a, n, 1); ntt(b, n, 1);
    for(int i = 0; i < n; i++) a[i] = mul(a[i], b[i]);
    ntt(a, n, 0);
}

int n, m;
int a[maxn<<1], b[maxn<<1];

int main() {
    n = read(); m = read();
    nttinit();
    for(int i = 0; i < n+1; i++) a[i] = read();
    for(int i = 0; i < m+1; i++) b[i] = read();
    Mul(a, n+1, b, m+1);
    for(int i = 0; i < n+m+1; i++) printf("%d ", a[i]);
    printf("\n");
    return 0;
}

1640ms。

#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
using namespace std;
inline int read() {
    int a = 0, c = getchar(), w = 1;
    for(; c < '0' || c > '9'; c = getchar()) if(c == '-') w = -1;
    for(; c >= '0' && c <= '9'; c = getchar()) a = a * 10 + c - '0';
    return a * w;
}

const double pi = 3.14159265358979323846264338327950288419716939937510582097494459230781640628620899;
struct complex {
    double r, v;
    complex() {}
    complex(double rr, double vv) {r = rr; v = vv;}
};
inline complex operator + (complex a, complex b) {
    return complex(a.r+b.r, a.v+b.v);
}
inline complex operator - (complex a, complex b) {
    return complex(a.r-b.r, a.v-b.v);
}
inline complex operator - (complex x) {
    return complex(-x.r, -x.v);
}
inline complex operator * (complex a, complex b) {
    return complex(a.r*b.r-a.v*b.v, a.r*b.v+a.v*b.r);
}

const int maxn = 1<<17;
void fft(complex a[], int n, bool typ) {
    for(int i = 1, j = n>>1; i < n; i++) {
        if(i < j) swap(a[i], a[j]);
        for(int k = n>>1; (j^=k) < k; k >>= 1);
    }
    for(int i = 1; i < n; i <<= 1) for(int j = 0; j < n; j += i<<1) {
        complex w = complex(1, 0), wn = complex(cos(pi/(double)i), (typ?1:-1)*sin(pi/(double)i));
        for(int k = 0; k < i; k++) {
            complex u = a[j+k], v = w * a[j+i+k];
            a[j+k] = u + v;
            a[j+i+k] = u - v;
            w = w * wn;
        }
    }
    if(!typ) for(int i = 0; i < n; i++) a[i].r /= n;
}
complex tmp[maxn<<1];
void Mul(complex a[], int an, complex b[], int bn) {
    if(an <= 48 || bn <= 48) {
        for(int i = 0; i < an+bn-1; i++) tmp[i] = complex(0, 0);
        for(int i = 0; i < an; i++) for(int j = 0; j < bn; j++) tmp[i+j] = tmp[i+j] + a[i] * b[j];
        for(int i = 0; i < an+bn-1; i++) a[i] = tmp[i];
        return;
    }
    int n = 1;
    while(n < an+bn-1) n <<= 1;
    fft(a, n, 1); fft(b, n, 1);
    for(int i = 0; i < n; i++) a[i] = a[i] * b[i];
    fft(a, n, 0);
}

int n, m;
complex a[maxn<<1], b[maxn<<1];

int main() {
    n = read(); m = read();
    for(int i = 0; i < n+1; i++) a[i] = complex(read(), 0);
    for(int i = 0; i < m+1; i++) b[i] = complex(read(), 0);
    Mul(a, n+1, b, m+1);
    for(int i = 0; i < n+m+1; i++) printf("%d ", int(a[i].r+0.5));
    printf("\n");
    return 0;
}

1919ms。

NTT板子的更多相关文章

  1. FFT && NTT板子

    贴板子啦-- FFT板子:luogu P3803 [模板]多项式乘法(FFT) #include<cstdio> #include<iostream> #include< ...

  2. Codeforces1096G Lucky Tickets(NTT优化dp)

    设\(f[i][j]\)表示填了\(i\)个数,数位和为\(j\)的方案数 于是方程为: \[f[i][j]=\sum_{k=0}^9 f[i-1][j-k]*[CanUse[k]==1]\] 其中\ ...

  3. CF632E: Thief in a Shop(快速幂+NTT)(存疑)

    A thief made his way to a shop. As usual he has his lucky knapsack with him. The knapsack can contai ...

  4. xjoi 2082: 小明的序列

    本文为博主原创文章,未均允许…… 反正我也没法管对吧 www点cnblogs点com/AwD-/ 维护一个序列,初始全为\(1\) 支持两种操作: 1.对于所有的位置\(i\),将它的值乘上\(i + ...

  5. 【比赛游记】FJOI2019瞎打记

    \(\mathrm{day}\) \(-4\) 又是睡到中午才起来,这样下去省选会睡迟的. 然后下午在补 WF2019 的题目,很快就能补完的(大雾). \(\mathrm{day}\) \(-3\) ...

  6. BZOJ 3992 【SDOI2015】 序列统计

    题目链接:序列统计 我来复习板子了……这道题也是我写的第一发求原根啊? 求原根方法: 从小到大依次枚举原根.设当前枚举的原根为\(x\),模数为\(p\),\(p-1\)的质因数分别为\(p_1,p_ ...

  7. PKUWC 2019 自闭记

    PKUWC 2019 自闭记 Day -1 考前天天在隔壁的物竞教室划水(雀魂,能和吉老师一起玩的游戏都是好游戏),没有做题. Day 0 早上8:16的高铁,到广州南居然要6个小时...不知道福州和 ...

  8. 51Nod 1028 大数乘法 V2

    http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1028 分析: FFT/NTT板子题... 代码: NTT板子: #inc ...

  9. P5162 WD与积木(多项式求逆+生成函数)

    传送门 题解 比赛的时候光顾着算某一个\(n\)的答案是多少忘了考虑不同的\(n\)之间的联系了--而且我也很想知道为什么推着推着会变成一个二项式反演-- 设\(f_n\)为\(n\)块积木时的总的层 ...

随机推荐

  1. xamarin.forms之实现ListView列表倒计时

    做商城类APP时经常会遇到抢购倒计时的功能,之前做小区宝iOS的时候也有类似的功能,想着参考iOS做的思路,自定义一个Cell,在Cell中每秒刷新一下控件的文本值,但使用xamarin.forms实 ...

  2. eclipse中的出现在打包一次后,后面新建的项目都出错了,出现support_v7下面出现红线及解决方法及为什么eclipse中项目继承ActionBarActivity解决方法一样

    第一次写博客,有什么问题或者想法的希望各位可以进行评论交流,望大家多多包涵! 遇到的问题是在新建的项目都出错了,出现support_v7下面出现红线及解决方法及为什么eclipse中项目继承Actio ...

  3. (摘)老司机也必须掌握的MySQL优化指南

    当 MySQL 单表记录数过大时,增删改查性能都会急剧下降,本文会提供一些优化参考,大家可以参考以下步骤来优化. 单表优化 除非单表数据未来会一直不断上涨,否则不要一开始就考虑拆分,拆分会带来逻辑.部 ...

  4. Java开发笔记(九)赋值运算符及其演化

    前面的加减乘除四则运算,计算结果通过等号输出给指定变量,注意此时代码把变量放到等号左边.而在算术课本里,加法运算的完整写法类似于“1+1=2”这样,运算结果应该跟在等号右边.不过代数课本里的方程式存在 ...

  5. Java开发笔记(五十三)关键字final的用法

    前面介绍了多态的相关用法,可以看到一个子类从父类继承之后,便能假借父类的名义到处晃悠.这种机制在正常情况之下没啥问题,但有时为了预防意外发生,往往只接受当事人来处理,不希望它的儿子乃至孙子来瞎掺和.可 ...

  6. Linux基础学习(全)

    使用的Linux发行版本为Redhat 1.Linux(RedHat)基础学习-命令行使用入门 2.Linux(RedHat)基础学习-文件寻址与管理 3.Linux(RadHat)基础学习-vim编 ...

  7. float浮动-清浮动BFC渲染机制

    float浮动,用于横向布局. 起初的横向布局都用display:inline-block,但是这会导致两个元素之间有空隙,而这是由代码换行解析成空格的,解决元素间有空隙,空格:font-size:0 ...

  8. ionic3 导航的应用(页面跳转与参数传递)

    about.html(跳转页面) <ion-content padding> <ion-list> <ion-item *ngFor="let he of co ...

  9. 自动给 Asp.Net Core WebApi 增加 ApiVersionNeutral

    自动给 Asp.Net Core WebApi 增加 ApiVersionNeutral Intro 新增加一个 Controller 的时候,经常忘记在 Controller 上增加 ApiVers ...

  10. Git:五、操作远程仓库

    0.一般流程 1)自己新写:GitHub创建有README的库 -> clone到本地 2)修改已有:GitHub上fork别人的仓库 -> clone自己账号下的库到本地 1.创建库 右 ...