Code:

#include<bits/stdc++.h>
#define setIO(s) freopen(s".in","r",stdin)
#define maxn 1000000
#define M 32768
#define double long double
#define ll long long
using namespace std;
namespace poly{
    const double pi=acos(-1);
    int rev[maxn],l;
    struct Cpx{
        double x,y;
        Cpx (double t1=0,double t2=0){x=t1,y=t2;}
    };
    Cpx operator+(Cpx a,Cpx b){ return Cpx(a.x+b.x,a.y+b.y);}
    Cpx operator-(Cpx a,Cpx b){ return Cpx(a.x-b.x, a.y-b.y); }
    Cpx operator*(Cpx a,Cpx b){ return Cpx(a.x*b.x-a.y*b.y, a.x*b.y+a.y*b.x); }
    void FFT(Cpx *a,int n,int flag){
        for(int i=0;i<n;++i) rev[i]=(rev[i>>1]>>1)|((i&1)<<(l-1));
        for(int i=0;i<n;++i) if(i<rev[i]) swap(a[i],a[rev[i]]);
        for(int mid=1;mid<n;mid<<=1){
            Cpx wn(cos(pi/mid), flag*sin(pi/mid)),x,y;
            for(int j=0;j<n;j+=(mid<<1)){
                Cpx w(1,0);
                for(int k=0;k<mid;++k) {
                    x=a[j+k],y=w*a[j+mid+k];
                    a[j+k]=x+y,a[j+mid+k]=x-y, w=w*wn;
                }
            }
        }
        if(flag==1) return;
        for(int i=0;i<n;++i) a[i].x=a[i].x/(double)n;
    }
    Cpx a[maxn<<1],b[maxn<<1],c[maxn<<1],d[maxn<<1];
    Cpx e[maxn<<1],g[maxn<<1],f[maxn<<1],h[maxn<<1];
    int ans[maxn];
    void MTT(int n,int m,int *F,int *G,int p){
        n+=m,l=0;
        for(m=1;m<=n;m<<=1) ++l;
        for(int i=0;i<n;++i) {
            a[i].x=F[i]/M,b[i].x=F[i]%M;
            c[i].x=G[i]/M,d[i].x=G[i]%M;
        }
        FFT(a,m,1),FFT(b,m,1),FFT(c,m,1),FFT(d,m,1);
        for(int i=0;i<m;++i){
            e[i]=a[i]*c[i],f[i]=a[i]*d[i];
            g[i]=b[i]*c[i],h[i]=b[i]*d[i];
        }
        FFT(e,m,-1),FFT(f,m,-1),FFT(g,m,-1),FFT(h,m,-1);
        for(int i=0;i<m;++i){
            ans[i]=(ll)(e[i].x+0.5)%p*M%p*M%p,ans[i]%=p;
            ans[i]+=(ll)(f[i].x+0.5)%p*M%p,ans[i]%=p;
            ans[i]+=(ll)(g[i].x+0.5)%p*M%p,ans[i]%=p;
            ans[i]+=(ll)(h[i].x+0.5)%p;
            ans[i]%=p;
        }
    }
};
int n,m,p;
int A[maxn<<1],B[maxn<<1];
int main(){
    //setIO("input");
    scanf("%d%d%d",&n,&m,&p);
    for(int i=0;i<=n;++i) scanf("%d",&A[i]);
    for(int i=0;i<=m;++i) scanf("%d",&B[i]);
    poly::MTT(n,m,A,B,p);
    for(int i=0;i<=n+m;++i) printf("%d ",poly::ans[i]);
    return 0;
}

  

luogu P4245 【模板】任意模数NTT MTT的更多相关文章

  1. [题解] Luogu P4245 [模板]任意模数NTT

    三模NTT 不会... 都0202年了,还有人写三模NTT啊... 讲一个好写点的做法吧: 首先取一个阀值\(w\),然后把多项式的每个系数写成\(aw + c(c < w)\)的形式,换句话说 ...

  2. 洛谷 P4245 [模板]任意模数NTT —— 三模数NTT / 拆系数FFT(MTT)

    题目:https://www.luogu.org/problemnew/show/P4245 用三模数NTT做,需要注意时间和细节: 注意各种地方要取模!传入 upt() 里面的数一定要不超过2倍 m ...

  3. 洛谷.4245.[模板]任意模数NTT(MTT/三模数NTT)

    题目链接 三模数\(NTT\): 就是多模数\(NTT\)最后\(CRT\)一下...下面两篇讲的都挺明白的. https://blog.csdn.net/kscla/article/details/ ...

  4. [洛谷P4245]【模板】任意模数NTT

    题目大意:给你两个多项式$f(x)$和$g(x)$以及一个模数$p(p\leqslant10^9)$,求$f*g\pmod p$ 题解:任意模数$NTT$,最大的数为$p^2\times\max\{n ...

  5. MTT:任意模数NTT

    MTT:任意模数NTT 概述 有时我们用FFT处理的数据很大,而模数可以分解为\(a\cdot 2^k+1\)的形式.次数用FFT精度不够,用NTT又找不到足够大的模数,于是MTT就应运而生了. MT ...

  6. 【模板】任意模数NTT

    题目描述: luogu 题解: 用$fft$水过(什么$ntt$我不知道). 众所周知,$fft$精度低,$ntt$处理范围小. 所以就有了任意模数ntt神奇$fft$! 意思是这样的.比如我要算$F ...

  7. 再探快速傅里叶变换(FFT)学习笔记(其三)(循环卷积的Bluestein算法+分治FFT+FFT的优化+任意模数NTT)

    再探快速傅里叶变换(FFT)学习笔记(其三)(循环卷积的Bluestein算法+分治FFT+FFT的优化+任意模数NTT) 目录 再探快速傅里叶变换(FFT)学习笔记(其三)(循环卷积的Blueste ...

  8. 任意模数NTT

    任意模数\(NTT\) 众所周知,为了满足单位根的性质,\(NTT\)需要质数模数,而且需要能写成\(a2^{k} + r\)且\(2^k \ge n\) 比较常用的有\(998244353,1004 ...

  9. BZOJ1042 HAOI2008硬币购物(任意模数NTT+多项式求逆+生成函数/容斥原理+动态规划)

    第一眼生成函数.四个等比数列形式的多项式相乘,可以化成四个分式.其中分母部分是固定的,可以多项式求逆预处理出来.而分子部分由于项数很少,询问时2^4算一下贡献就好了.这个思路比较直观.只是常数巨大,以 ...

随机推荐

  1. Git学习笔记(1)

    1.安装Git: 在linux下安装:yum install git 其他系统安装在这里略去~~~ 安装完成后,需要设置一下,在命令行输入以下命令: [root@xwq ~]# git config ...

  2. MAVEN 构建包的引用

    1.什么叫构建包的引用? 当你存在两个maven项目分别是项目A,项目B时,且项目B要引用项目A的方法,那么你就用把项目A打成*.jar架包,放到本地的Maven仓库提供给项目B去引用. A.用命令到 ...

  3. Django安装部署

    MVC模式说明 Model:是应用程序中用于处理应用程序数据逻辑的部分,通常模型对象负责在数据库中存取数据 View: 是应用程序中处理数据显示的部分,通常视图是依据模型数据创建的 Controlle ...

  4. mysql 插入更新在一条sql ON DUPLICATE KEY UPDATE

    有时候需要进行数据操作的,如果有数据则更新数据, 没有数据则插入. 以往的做法是先查询,再根据查询结果进行判断,执行插入或更新操作 其实 有一种 ON DUPLICATE KEY UPDATE 语法, ...

  5. RobotFrameWork+APPIUM实现对安卓APK的自动化测试----第二篇【原理】

    http://blog.csdn.net/deadgrape/article/details/50574459 接着上一篇,我们开始聊聊APPIUM的框架和运行模式.废话不多说直接上图. 1.首先自动 ...

  6. struts配置 WEB得拷贝要注意的事项

    原始WEB文件tutoral===>新文件tutoralTest 要将靠拷贝的文件的contextRoot修改(一定要修改)

  7. C# 中使用 Obsolete 标志 代码过期

    今天对项目做了一次更新,创建了一个新的类来替换原来的工作. 可是又不想删掉.一旦删掉在SVN上就不存在了.决定还是用 Obsolete来标志代码过期吧. MSDN上关于Obsolete 标签的介绍 h ...

  8. 腾讯云 ubuntuservermysql安装和外网訪问

    1 腾讯云 购买ubuntu 默认账户是ubuntu(因为winscp 使用ubuntu没有权限写文件) 因为腾讯云主机ubuntu系统默认username为ubuntu,不喜欢每次做什么都要sudo ...

  9. 使用Struts2和jQuery EasyUI实现简单CRUD系统(五)——jsp,json,EasyUI的结合

    这部分比較复杂,之前看过自己的同学开发一个选课系统的时候用到了JSON,可是一直不知道有什么用.写东西也没用到.所以没去学他.然后如今以这样的怀着好奇心,这是做什么用的,这是怎么用的.这是怎么结合的心 ...

  10. Common webpart properties in kentico

    https://devnet.kentico.com/docs/7_0/devguide/index.html?common_web_part_properties.htm HTML Envelope ...