这两天有点颓,所以东西学的也很慢。。。这个一眼就能推出来的活生生卡了我两天。。

说几个细节:

柿子:

$$fg = (\frac{f}{M} +f%m)(\frac{g}{M} +g%m) $$

\(M\)通常设置为\(32768\)。把上一步的几个韩束化成\(a,b,c,d\)的形式,答案就是:

  • \(M * M * a * c+M * (a * d + b *c) +b * d\)

一看卷积,多搞几次\(FFT\)就过去了。

  • 处处小心膜爆。有效方法如下。

    • #define int long long
      #define double long double
      int add (int x, int y) {x %= p, y %= p; return (((x + y) % p) + p) % p;}
      int mul (int x, int y) {x %= p, y %= p; return (((x * y) % p) + p) % p;}
  • 数组记得开大。\(N<<2\)左右。

#include <bits/stdc++.h>
using namespace std; #define int long long
#define double long double const int N = 600010;
const double pi = acos (-1); int n, m, p, lim = 1, f[N], g[N], rev[N], res[N]; struct Complex {
double x, y;
Complex (double _x = 0, double _y = 0) {x = _x, y = _y;}
Complex operator + (Complex rhs) {return Complex (x + rhs.x, y + rhs.y);}
Complex operator - (Complex rhs) {return Complex (x - rhs.x, y - rhs.y);}
Complex operator * (Complex rhs) {return Complex (x * rhs.x - y * rhs.y, x * rhs.y + y * rhs.x);}
}a[N], b[N], c[N], d[N], t1[N], t2[N], t3[N], t4[N]; const int M = 32768;
signed add (int x, int y) {x %= p, y %= p; return (((x + y) % p) + p) % p;}
signed mul (int x, int y) {x %= p, y %= p; return (((x * y) % p) + p) % p;} void fast_fast_tle (Complex *A, int type) {
for (int i = 0; i < lim; ++i) {
if (i < rev[i]) {
swap (A[i], A[rev[i]]);
}
}
for (int mid = 1; mid < lim; mid <<= 1) {
Complex Wn (cos (pi / mid), type * sin (pi / mid));
for (int p = 0; p < lim; p += (mid << 1)) {
Complex w (1, 0);
for (int i = 0; i < mid; ++i, w = w * Wn) {
Complex x = A[p + i], y = w * A[p + i + mid];
A[p + i] = x + y;
A[p + i + mid] = x - y;
}
}
}
if (type == -1) {
for (int i = 0; i < lim; ++i) {
A[i].x /= lim;
}
}
} signed main () {
cin >> n >> m >> p;
for (int i = 0; i <= n; ++i) {
cin >> f[i];
a[i].x = f[i] / M;
b[i].x = f[i] % M;
}
for (int i = 0; i <= m; ++i) {
cin >> g[i];
c[i].x = g[i] / M;
d[i].x = g[i] % M;
}
while (lim <= n + m) lim <<= 1;
for (int i = 0; i < lim; ++i) {
rev[i] = (rev[i >> 1] >> 1) + (i & 1) * (lim / 2);
}
fast_fast_tle (a, 1), fast_fast_tle (b, 1); fast_fast_tle (c, 1), fast_fast_tle (d, 1);
for (int i = 0; i < lim; ++i) {
t1[i] = a[i] * c[i], t2[i] = a[i] * d[i], t3[i] = b[i] * c[i], t4[i] = b[i] * d[i];
}
fast_fast_tle (t1, -1), fast_fast_tle (t2, -1); fast_fast_tle (t3, -1), fast_fast_tle (t4, -1);
for (int i = 0; i < lim; ++i) {
res[i] = add (res[i], mul (mul (M, M), (int) (t1[i].x + 0.1)));
res[i] = add (res[i], mul (mul (M, 1), (int) (t2[i].x + 0.1)));
res[i] = add (res[i], mul (mul (M, 1), (int) (t3[i].x + 0.1)));
res[i] = add (res[i], mul (mul (1, 1), (int) (t4[i].x + 0.1)));
}
for (int i = 0; i <= n + m; ++i) printf ("%lld ", res[i]);
}

任意模数NTT学习笔记的更多相关文章

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

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

  2. FFT和NTT学习笔记_基础

    FFT和NTT学习笔记 算法导论 参考(贺) http://picks.logdown.com/posts/177631-fast-fourier-transform https://blog.csd ...

  3. 任意模数NTT

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

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

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

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

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

  6. 【模板】任意模数NTT

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

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

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

  8. MTT:任意模数NTT

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

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

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

随机推荐

  1. SQL Server 迁移至MySQL 关键步骤的梳理总结

    迁移主要是通过Navicat工具来实现的.迁移工具的选定在此不讨论. 迁移前准备 1.提前通知DBA\SA\BI等,并确认发布计划及数据库迁移方案. 2.梳理出SQL  Server DB 中影响业务 ...

  2. sql取指定时间段内的所有月份

    declare @begin datetime,@end datetime set @begin='2017-01-01' set @end='2019-03-04' declare @months ...

  3. java反射(java.lang.reflect) ---普通单例模式唯一性问题

    1. 普通的饱汉式.饿汉式 package org.bighead.test2; public class TestPrivate { private String str = "strPr ...

  4. Github上html页面(包括CSS样式和JS效果)如何显示出来

    在看Github上项目时,发现有的html页面效果能很好的展现出来,而有的则不能.对这个问题很好奇,因此研究了一下,最终做到了将页面展示出来的目的.下面以我的Github的开源项目bootstrap- ...

  5. 电脑出现问题如何修复Windows 10

    也许Windows 10无法启动.或者它可能会靴子,但会崩溃很多.在任何一种情况下,您都需要在使用PC之前解决问题.以下是修复Windows 10的几种方法. 方法1:使用Windows启动修复 如果 ...

  6. #019 还未搞明白的C语言问题

    吐槽一下作业系统 自己电脑上跑的好好地到他这里就给我算错了.... 是我的问题还是系统的问题?????摸不着头脑 总分 12 从键盘任意输入某班30个学生的成绩(成绩类型为整型),保存到数组中,并输出 ...

  7. kernel笔记——库文件与系统调用

    库文件 先从我们熟悉的c库入手,理解系统调用(system call).c代码中调用printf函数,经历了以下调用过程:   最终输出的功能由内核中write调用完成,c库封装了系统调用. 对于以下 ...

  8. SQLi “百度杯”CTF比赛 九月场

    试一下1=1 发下username为空,说明哪里出问题了,是没有注入吗?还是被过滤了?试一下#号的url编码%23 编码后,返回的结果是对的,证明是的,有注入 1=2就返回空了 看了wp,就觉得自己的 ...

  9. ELK原理与简介

    为什么用到ELK: 一般我们需要进行日志分析场景:直接在日志文件中 grep.awk 就可以获得自己想要的信息.但在规模较大的场景中,此方法效率低下,面临问题包括日志量太大如何归档.文本搜索太慢怎么办 ...

  10. SQLserver查询库中包含某个字段的表

    select [name] from [TPMS_PRD].[dbo].sysobjects where id in(select id from [TPMS_PRD].[dbo].syscolumn ...