题意:

P4245 【模板】任意模数多项式乘法

题解:

NTT模板,记录一下

代码:

#include <bits/stdc++.h>using namespace std;#define REP(i, a, b) for (int i= (a), _end_= (b); i < _end_; ++i)
#define debug(...) fprintf(stderr, __VA_ARGS__)
#define mp make_pair
#define x first
#define y second
#define pb push_back
#define SZ(x) (int((x).size()))
#define ALL(x) (x).begin(), (x).end()template <typename T> inline bool chkmin(T& a, const T& b)
{return a > b ? a= b, 1 : 0;
}
template <typename T> inline bool chkmax(T& a, const T& b)
{return a < b ? a= b, 1 : 0;
}typedef long long LL;const int oo= 0x3f3f3f3f;int Mod;const int max0= 262144;struct comp
{double x, y;comp() : x(0), y(0){}comp(const double& _x, const double& _y) : x(_x), y(_y){}
};inline comp operator+(const comp& a, const comp& b)
{return comp(a.x + b.x, a.y + b.y);
}
inline comp operator-(const comp& a, const comp& b)
{return comp(a.x - b.x, a.y - b.y);
}
inline comp operator*(const comp& a, const comp& b)
{return comp(a.x * b.x - a.y * b.y, a.x * b.y + a.y * b.x);
}
inline comp conj(const comp& a)
{return comp(a.x, -a.y);
}const double PI= acos(-1);int N, L;comp w[max0 + 5];
int bitrev[max0 + 5];void fft(comp* a, const int& n)
{REP(i, 0, n) if (i < bitrev[i]) swap(a[i], a[bitrev[i]]);for (int i= 2, lyc= n >> 1; i <= n; i<<= 1, lyc>>= 1)for (int j= 0; j < n; j+= i) {comp *l= a + j, *r= a + j + (i >> 1), *p= w;REP(k, 0, i >> 1){comp tmp= *r * *p;*r= *l - tmp, *l= *l + tmp;++l, ++r, p+= lyc;}}
}inline void fft_prepare()
{REP(i, 0, N) bitrev[i]= bitrev[i >> 1] >> 1 | ((i & 1) << (L - 1));REP(i, 0, N) w[i]= comp(cos(2 * PI * i / N), sin(2 * PI * i / N));
}inline void conv(int* x, int* y, int* z)
{REP(i, 0, N)(x[i]+= Mod)%= Mod, (y[i]+= Mod)%= Mod;static comp a[max0 + 5], b[max0 + 5];static comp dfta[max0 + 5], dftb[max0 + 5], dftc[max0 + 5], dftd[max0 + 5];REP(i, 0, N) a[i]= comp(x[i] & 32767, x[i] >> 15);REP(i, 0, N) b[i]= comp(y[i] & 32767, y[i] >> 15);fft(a, N), fft(b, N);REP(i, 0, N){int j= (N - i) & (N - 1);static comp da, db, dc, dd;da= (a[i] + conj(a[j])) * comp(0.5, 0);db= (a[i] - conj(a[j])) * comp(0, -0.5);dc= (b[i] + conj(b[j])) * comp(0.5, 0);dd= (b[i] - conj(b[j])) * comp(0, -0.5);dfta[j]= da * dc;dftb[j]= da * dd;dftc[j]= db * dc;dftd[j]= db * dd;}REP(i, 0, N) a[i]= dfta[i] + dftb[i] * comp(0, 1);REP(i, 0, N) b[i]= dftc[i] + dftd[i] * comp(0, 1);fft(a, N), fft(b, N);REP(i, 0, N){int da= (LL)(a[i].x / N + 0.5) % Mod;int db= (LL)(a[i].y / N + 0.5) % Mod;int dc= (LL)(b[i].x / N + 0.5) % Mod;int dd= (LL)(b[i].y / N + 0.5) % Mod;z[i]= (da + ((LL)(db + dc) << 15) + ((LL)dd << 30)) % Mod;}
}int main()
{// #ifndef ONLINE_JUDGE// freopen("input.txt", "r", stdin);// freopen("output.txt", "w", stdout);// #endifint n, m;static int a[max0 + 5], b[max0 + 5], c[max0 + 5];scanf("%d%d%d", &n, &m, &Mod), ++n, ++m;REP(i, 0, n) scanf("%d", a + i);REP(i, 0, m) scanf("%d", b + i);L= 0;for (; (1 << L) < n + m - 1; ++L);N= 1 << L;fft_prepare();conv(a, b, c);REP(i, 0, n + m - 1)(c[i]+= Mod)%= Mod, printf("%d ", c[i]);printf("\n");return 0;
}

P4245 【模板】任意模数多项式乘法(NTT)相关推荐

  1. P4245 【模板】任意模数多项式乘法

    P4245 [模板]任意模数多项式乘法 https://www.luogu.com.cn/blog/AzusaCat/solution-p4245 首先这类问题指的是对于一个非NTT模数,我们如何计算 ...

  2. P4239 任意模数多项式乘法逆(多项式/ MTT)

    P4239 任意模数多项式乘法逆 这个题目简直就是毒瘤,不过还好我们可以使用vector封装要不然真的没法看,现在我们就会用vector封装MTT了,然后有一个代码细节就是这里的求逆还是在模意义下的, ...

  3. P4245-[模板]任意模数多项式乘法

    正题 题目链接:https://www.luogu.com.cn/problem/P4245 题目大意 两个多项式,求它们的乘积模ppp. 解题思路 方法好像挺多,我用的是最简单的一种就是,先定一个常 ...

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

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

  5. 洛谷 P4245 【模板】任意模数NTT

    洛谷 P4245 [模板]任意模数NTT 贴个板子,4次DFT. Code #include<cstdio> #include<algorithm> #include<c ...

  6. 任意模数ntt_【知识总结】多项式全家桶(三)(任意模数NTT)

    经过两个月的咕咕,"多项式全家桶" 系列终于迎来了第三期--(雾) 先膜拜(伏地膜)大恐龙的博客:任意模数 NTT (在页面右侧面板 "您想嘴谁" 中选择 &q ...

  7. 【知识总结】多项式全家桶(三)(任意模数NTT)

    经过两个月的咕咕,"多项式全家桶" 系列终于迎来了第三期--(雾) 上一篇:[知识总结]多项式全家桶(二)(ln和exp) 先膜拜(伏地膜)大恐龙的博客:任意模数 NTT (在页面 ...

  8. 【luogu P3803】【模板】多项式乘法(NTT)

    [模板]多项式乘法(NTT) 题目链接:luogu P3803 题目大意 给你两个多项式,要你求它们的卷积. 思路 这次我们写 NTT 的做法. 它的优点就是它可以取模,而且不会有精度问题,而且会比 ...

  9. 洛谷 - P3803 【模板】多项式乘法(FFT/NTT)

    题目链接:点击查看 题目大意:给出两个多项式 F( x ) 和 G( x ) 的系数,求其卷积后的系数 题目分析:存一个FFT的模板,原理学不明白,数论和dp都扔给队友了,当个快乐的fw 代码: // ...

最新文章

  1. 【音频】Faad源码交叉编译
  2. Linux 这些工具堪称神器!
  3. 简单客户端服务器模型(C++、python和go语言示例)
  4. [转]关于int整形变量占有字节问题
  5. mysql id in set_mysql数据库中find_in_set()和in()用法区别
  6. 中关村-DIY操作系统之不分区安装Ubuntu系统
  7. tensorflow安装正确, import tf, the problem is Couldn't find field google.protob.ExtensionRange.options
  8. vue循环中的v-show
  9. _linux中curl命令详解-linux运维
  10. 修改mysql数据库编码(5.7版本)
  11. 《Redis入门指南》第2版 读书笔记
  12. Spark之RDD实战篇3
  13. (转)postgresql+postgis空间数据库使用总结
  14. 安卓工控主板运行时会自动重启_工控机日常维护的方法与步骤
  15. 怎么终止linux的次序运行程序,linux – 如何按特定顺序停止systemd服务
  16. jupyetr notebook添加anaconda虚拟环境内核(tensorflow+pytorch)
  17. 最新:斐讯K3千兆无线路由器刷官改版固件的详细图文教程
  18. 浅谈IEEE会议论文的不出席政策Non-Presented Paper(No-Show)Policy
  19. mysql 数据库遭遇 Loki 加密勒索病毒数据恢复
  20. Elasticsearch: collapse 去重

热门文章

  1. 这是啥?也太秀了吧?
  2. 现在女生的床真的都是这样吗?
  3. 世界头号毒枭古斯曼被捕,全因被内部IT男出卖!
  4. 宝宝学数学的第一套书,秒杀题海战术!上小学前应该这样学数学!
  5. 967c语言程序设计是什么,2018年湖南师范大学数学与计算机科学院967C语言程序设计和数据结构[专硕]之C程序设计考研核心题库...
  6. 128位计算机 ps2,64位就是最强电脑?难道就没有128位的电脑吗
  7. mysql group_concat去重_MySQL group_concat() 函数用法
  8. cta策略 有哪些_CTA 主流的交易策略都有哪些?
  9. mysql数据库的安装和配置文件_MySQL 数据库安装与配置详解
  10. baseresponse响应类_Java response响应体和文件下载实现原理