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

这篇博客介绍了如何运用非交换快速傅里叶变换(NTT)来求解两个多项式的卷积。NTT的优势在于可以取模且避免精度问题,适合于特定模数如998244353。文章详细阐述了NTT的原理,包括原根的概念,以及如何通过单位根的性质进行转换。代码示例中展示了NTT的实现过程,包括原根的计算、NTT的正向和反向变换,最后给出了求解多项式卷积的完整C++代码。

【模板】多项式乘法(NTT)

题目链接:luogu P3803

题目大意

给你两个多项式,要你求它们的卷积。

思路

这次我们写 NTT 的做法。
它的优点就是它可以取模,而且不会有精度问题,而且会比 FFT 稍微快一点?

然而它的确定就是它的模数比较死板,一般就 998244353 , 1004535809 , 469762049 998244353,1004535809,469762049 998244353,1004535809,469762049 这些。(它们的原根都是 3 3 3

其实就是考虑用原根代替复数。
因为它是跟单位根有着相同的性质。

然后通过证明,我们可以得到 ω n ≡ g p − 1 n m o d    p \omega_n\equiv g^{\frac{p-1}{n}}\mod p ωngnp1mod

### 解题思路 假设要跳 $k$ 次,根据青蛙 A 和青蛙 B 的初始位置以及每次跳跃的距离,可以推出公式 $x + nk \equiv y + mk \pmod{l}$,进一步变形为 $(x - y) + k(n - m) \equiv 0 \pmod{l}$。定义 $A = (x - y)$,$B = (n - m)$,解除同余后得到 $xB - kl = A$,令 $y = -k$,则有 $xB + yl = A$,这是一个扩展欧几里得算法可以解决的线性不定方程问题。如果 $A$ 不能被 $\gcd(B, l)$ 整除,则方程无解;否则,先求出 $xB + yl = \gcd(B, l)$ 的一组解,再通过倍数关系得到 $xB + yl = A$ 的解,最后求出最小正整数解 [^3]。 ### 代码实现 ```cpp #include<iostream> #include<cstdio> #include<algorithm> #include<string> #include<cstring> #include<cmath> using namespace std; long long n, m, x, y, k, num, xt, yt; long long gcd(long long x, long long y) { int k1; while (y != 0) { k1 = x % y; x = y; y = k1; } return x; } long long gcd2(long long x, long long y, long long &xt, long long &yt) { long long k2; if (!y) { xt = 1; yt = 0; return x; } num = gcd2(y, x % y, xt, yt); k2 = xt; xt = yt; yt = k2 - x / y * yt; return num; } int main() { cin >> x >> y >> n >> m >> k; m = m - n; x = x - y; if (m < 0) { m = -m; x = -x; } gcd2(m, k, xt, yt); if (x % num != 0) cout << "Impossible"; else cout << ((xt * (x / num)) % (k / num) + (k / num)) % (k / num); return 0; } ``` ### 代码解释 - `gcd` 函数:用于计算两个数的最大公约数,使用辗转相除法实现。 - `gcd2` 函数:扩展欧几里得算法,用于求解 $xB + yl = \gcd(B, l)$ 的一组解。 - `main` 函数:读取输入数据,将方程变形,调用 `gcd2` 函数求解,根据结果输出最小正整数解或 "Impossible"。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值