多项式开根

多项式开根

给定多项式g(x)g(x)g(x),求f(x)f(x)f(x),满足f2(x)=g(x)f ^ 2(x) = g(x)f2(x)=g(x)

假设我们已经得到了g(x)g(x)g(x),膜x⌈n2⌉x ^{\lceil \frac{n}{2} \rceil}x2n下的根f0(x)f_0 (x)f0(x),要求膜xnx ^ nxn下的根f(x)f(x)f(x)

f02(x)≡g(x)(modx⌈n2⌉)f_0 ^2(x) \equiv g(x) \pmod {x ^{\lceil \frac{n}{2} \rceil}}f02(x)g(x)(modx2n)

移项再开方有(f02(x)−g(x))2≡0(modxn)\left(f_0 ^2(x) - g(x) \right) ^ 2 \equiv 0 \pmod {x ^ n}(f02(x)g(x))20(modxn)

则,(f02(x)+g(x))2≡4f02(x)g(x)(modxn)\left( f_0 ^ 2(x) + g(x) \right) ^ 2 \equiv 4 f_0 ^ 2(x) g(x) \pmod {x ^ n}(f02(x)+g(x))24f02(x)g(x)(modxn)

g(x)≡(f02(x)+g(x)2f0(x))2(modxn)g(x) \equiv \left(\frac{f_0 ^ 2(x) + g(x)}{2f_0 (x)} \right) ^ 2 \pmod {x ^ n}g(x)(2f0(x)f02(x)+g(x))2(modxn)

所以f(x)≡f02(x)+g(x)2f0(x)(modxn)f(x) \equiv \frac{f_0 ^ 2(x) + g(x)}{2f_0(x)} \pmod {x ^ n}f(x)2f0(x)f02(x)+g(x)(modxn)

所以有f(x)≡2−1f0(x)+2−1f0−1(x)g(x)(modxn)f(x) \equiv 2 ^{-1} f_0 (x) + 2 ^{-1} f_0 ^{-1}(x) g(x) \pmod {x ^ n}f(x)21f0(x)+21f01(x)g(x)(modxn)

对于g(0)=1g(0) = 1g(0)=1的特殊情况

#include <bits/stdc++.h>using namespace std;typedef long long ll;const int N = 5e6 + 10, mod = 998244353, inv2 = mod + 1 >> 1;int a[N], b[N], c[N], d[N], r[N];int quick_pow(int a, int n) {int ans = 1;while (n) {if (n & 1) {ans = 1ll * ans * a % mod;}a = 1ll *  a * a % mod;n >>= 1;}return ans;
}void get_r(int lim) {for (int i = 0; i < lim; i++) {r[i] = (i & 1) * (lim >> 1) + (r[i >> 1] >> 1);}
}void NTT(int *f, int lim, int rev) {for (int i = 0; i < lim; i++) {if (i < r[i]) {swap(f[i], f[r[i]]);}}for (int mid = 1; mid < lim; mid <<= 1) {int wn = quick_pow(3, (mod - 1) / (mid << 1));for (int len = mid << 1, cur = 0; cur < lim; cur += len) {int w = 1;for (int k = 0; k < mid; k++, w = 1ll * w * wn % mod) {int x = f[cur + k], y = 1ll * w * f[cur + mid + k] % mod;f[cur + k] = (x + y) % mod, f[cur + mid + k] = (x - y + mod) % mod;}}}if (rev == -1) {int inv = quick_pow(lim, mod - 2);reverse(f + 1, f + lim);for (int i = 0; i < lim; i++) {f[i] = 1ll * f[i] * inv % mod;}}
}void polyinv1(int *a, int *b, int n) {if (n == 1) {b[0] = quick_pow(a[0], mod - 2);return ;}polyinv1(a, b, n + 1 >> 1);int lim = 1;while (lim < 2 * n) {lim <<= 1;}get_r(lim);for (int i = 0; i < n; i++) {c[i] = a[i];}for (int i = n; i < lim; i++) {c[i] = 0;}NTT(b, lim, 1);NTT(c, lim, 1);for (int i = 0; i < lim; i++) {int cur = (2 - 1ll * c[i] * b[i] % mod + mod) % mod;b[i] = 1ll * b[i] * cur % mod;}NTT(b, lim, -1);for (int i = n; i < lim; i++) {b[i] = 0;}
}void polysqrt(int *a, int *b, int n) {if (n == 1) {b[0] = 1;return ;}polysqrt(a, b, n + 1 >> 1);int lim = 1;while (lim < 2 * n) {lim <<= 1;}for (int i = 0; i < lim; i++) {d[i] = 0;}polyinv1(b, d, n);for (int i = 0; i < n; i++) {c[i] = a[i];}for (int i = n; i < lim; i++) {c[i] = 0;}get_r(lim);NTT(b, lim, 1);NTT(c, lim, 1);NTT(d, lim, 1);for (int i = 0; i < lim; i++) {b[i] = (1ll * inv2 * b[i] % mod + 1ll * inv2 * d[i] % mod * c[i] % mod) % mod; }NTT(b, lim, -1);for (int i = n; i < lim; i++) {b[i] = 0;}
}int main() {// freopen("in.txt", "r", stdin);// freopen("out.txt", "w", stdout);// ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);int n;scanf("%d", &n);for (int i = 0; i < n; i++) {scanf("%d", &a[i]);}polysqrt(a, b, n);for (int i = 0; i < n; i++) {printf("%d%c", b[i], i + 1 == n ? '\n' : ' ');}return 0;
}

二次剩余解一般情况

#include <bits/stdc++.h>using namespace std;typedef long long ll;const int N = 5e6 + 10, mod = 998244353, inv2 = mod + 1 >> 1;int a[N], b[N], c[N], d[N], r[N];namespace Quadratic_residue {struct Complex {int r, i;Complex(int _r = 0, int _i = 0) : r(_r), i(_i) {}};int I2;Complex operator * (const Complex &a, Complex &b) {return Complex((1ll * a.r * b.r % mod  + 1ll * a.i * b.i % mod * I2 % mod) % mod, (1ll * a.r * b.i % mod + 1ll * a.i * b.r % mod) % mod);}Complex quick_pow(Complex a, int n) {Complex ans = Complex(1, 0);while (n) {if (n & 1) {ans = ans * a;}a = a * a;n >>= 1;}return ans;}int get_residue(int n) {mt19937 e(233);if (n == 0) {return 0;}if(quick_pow(n, (mod - 1) >> 1).r == mod - 1) {return -1;}uniform_int_distribution<int> r(0, mod - 1);int a = r(e);while(quick_pow((1ll * a * a % mod - n + mod) % mod, (mod - 1) >> 1).r == 1) {a = r(e);}I2 = (1ll * a * a % mod - n + mod) % mod;int x = quick_pow(Complex(a, 1), (mod + 1) >> 1).r, y = mod - x;if(x > y) swap(x, y);return x;}
}int quick_pow(int a, int n) {int ans = 1;while (n) {if (n & 1) {ans = 1ll * ans * a % mod;}a = 1ll *  a * a % mod;n >>= 1;}return ans;
}void get_r(int lim) {for (int i = 0; i < lim; i++) {r[i] = (i & 1) * (lim >> 1) + (r[i >> 1] >> 1);}
}void NTT(int *f, int lim, int rev) {for (int i = 0; i < lim; i++) {if (i < r[i]) {swap(f[i], f[r[i]]);}}for (int mid = 1; mid < lim; mid <<= 1) {int wn = quick_pow(3, (mod - 1) / (mid << 1));for (int len = mid << 1, cur = 0; cur < lim; cur += len) {int w = 1;for (int k = 0; k < mid; k++, w = 1ll * w * wn % mod) {int x = f[cur + k], y = 1ll * w * f[cur + mid + k] % mod;f[cur + k] = (x + y) % mod, f[cur + mid + k] = (x - y + mod) % mod;}}}if (rev == -1) {int inv = quick_pow(lim, mod - 2);reverse(f + 1, f + lim);for (int i = 0; i < lim; i++) {f[i] = 1ll * f[i] * inv % mod;}}
}void polyinv1(int *a, int *b, int n) {if (n == 1) {b[0] = quick_pow(a[0], mod - 2);return ;}polyinv1(a, b, n + 1 >> 1);int lim = 1;while (lim < 2 * n) {lim <<= 1;}get_r(lim);for (int i = 0; i < n; i++) {c[i] = a[i];}for (int i = n; i < lim; i++) {c[i] = 0;}NTT(b, lim, 1);NTT(c, lim, 1);for (int i = 0; i < lim; i++) {int cur = (2 - 1ll * c[i] * b[i] % mod + mod) % mod;b[i] = 1ll * b[i] * cur % mod;}NTT(b, lim, -1);for (int i = n; i < lim; i++) {b[i] = 0;}
}void polysqrt(int *a, int *b, int n) {if (n == 1) {b[0] = Quadratic_residue::get_residue(a[0]);return ;}polysqrt(a, b, n + 1 >> 1);int lim = 1;while (lim < 2 * n) {lim <<= 1;}for (int i = 0; i < lim; i++) {d[i] = 0;}polyinv1(b, d, n);for (int i = 0; i < n; i++) {c[i] = a[i];}for (int i = n; i < lim; i++) {c[i] = 0;}get_r(lim);NTT(b, lim, 1);NTT(c, lim, 1);NTT(d, lim, 1);for (int i = 0; i < lim; i++) {b[i] = (1ll * inv2 * b[i] % mod + 1ll * inv2 * d[i] % mod * c[i] % mod) % mod; }NTT(b, lim, -1);for (int i = n; i < lim; i++) {b[i] = 0;}
}int main() {// freopen("in.txt", "r", stdin);// freopen("out.txt", "w", stdout);// ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);int n;scanf("%d", &n);for (int i = 0; i < n; i++) {scanf("%d", &a[i]);}polysqrt(a, b, n);for (int i = 0; i < n; i++) {printf("%d%c", b[i], i + 1 == n ? '\n' : ' ');}return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/313984.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

通过Service访问应用 (2)

目录 通过NodePort Service在外部访问集群应用 通过LoadBalancer Service在外部访问集群应用 Microsoft SQL Server数据库部署 为了便于理解和学习&#xff0c;请先阅读上一篇《通过Service访问应用 &#xff08;1&#xff09;》再继续学习本篇内容。通过NodePort Service在外…

2019-03-18-算法-进化(反转链表)

题目描述 反转一个单链表。 示例: 输入: 1->2->3->4->5->NULL 输出: 5->4->3->2->1->NULL进阶: 你可以迭代或递归地反转链表。你能否用两种方法解决这道题&#xff1f; /*** 思路1&#xff1a;迭代法&#xff0c;直接依次反转链表* 时间复杂度…

分治FFT

分治FFT 考虑计算这么一个式子f(i)∑j1ifi−jg(j)f(i) \sum\limits_{j 1} ^{i} f_{i - j}g(j)f(i)j1∑i​fi−j​g(j)&#xff0c;给定g(x)g(x)g(x)&#xff0c;求f(x)f(x)f(x)&#xff0c;边界条件f(0)1f(0) 1f(0)1。 假设我们已经算出[l,mid][l, mid][l,mid]&#xff0c…

微软商业智能BI知识整合篇-五大工具产品系列文章

在最近2个月时间里&#xff0c;笔者尝试将自身在企业级商业智能BI的知识及经验进行梳理&#xff0c;以文章的方式输送给广大读者们阅读。笔者同样是非科班专业人员&#xff0c;但在过往的摸索过程中&#xff0c;积累的系列知识足够应付一般性地企业级商业智能BI项目需要。相信在…

2019-03-21-算法-进化(合并两个有序链表)

题目描述 将两个有序链表合并为一个新的有序链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 示例&#xff1a; 输入&#xff1a;1->2->4, 1->3->4 输出&#xff1a;1->1->2->3->4->4思路1&#xff1a;双指针法 /*** 合并两个有序…

多项式对数函数ln f(x)

多项式对数函数ln⁡f(x)\ln f(x)lnf(x) 如果存在解必然有[x0]f(x)1[ x ^ 0]f(x) 1[x0]f(x)1&#xff0c; 对ln⁡f(x)\ln f(x)lnf(x)求导&#xff0c;有dln⁡f(x)dx≡f′(x)f(x)(modxn)\frac{d \ln f(x)}{dx} \equiv \frac{f(x)}{f(x)} \pmod {x ^ n}dxdlnf(x)​≡f(x)f′(x)…

【A】兼容Core3.0后 Natasha 的隔离域与热编译操作。

文章转载授权级别&#xff1a;A 预计阅读时间&#xff1a;15分钟一、 2.0预览版本增加了哪些功能大部分为底层的升级优化&#xff0c;例如&#xff1a;引擎兼容 Core3.0优化编译流程&#xff0c;增加编译前语法检测及日志&#xff0c;统一采用流加载方式在 Vito 的建议…

2019-03-22-算法-进化(回文链表)

题目描述 请判断一个链表是否为回文链表。 示例 1: 输入: 1->2 输出: false示例 2: 输入: 1->2->2->1 输出: true进阶&#xff1a; 你能否用 O(n) 时间复杂度和 O(1) 空间复杂度解决此题&#xff1f; 解题 思路1&#xff1a;直接利用List的顺序存储性&#x…

多项式牛顿迭代(应用:求逆,开根,对数exp)

多项式牛顿迭代 给定多项式g(x)g(x)g(x)&#xff0c;求f(x)f(x)f(x)&#xff0c;满足g(f(x))≡0(modxn)g(f(x)) \equiv 0 \pmod {x ^ n}g(f(x))≡0(modxn)。 泰勒展开 对于现有得f(x)f(x)f(x)&#xff0c;构造一个多项式g(x)g(x)g(x)&#xff0c;使得f(n)(x)g(n)(x)f^{(n)}(…

.NET Core 使用 K8S ConfigMap的正确姿势

背景ASP.NET Core默认的配置文件定义在 appsetings.json和 appsettings.{Environment}.json文件中。这里面有一个问题就是&#xff0c;在使用容器部署时&#xff0c;每次修改配置文件都需要重新构建镜像。当然你也可能会说&#xff0c;我的配置文件很稳定不需要修改&#xff0c…

2019-03-22-算法-进化(环形链表)

题目描述 给定一个链表&#xff0c;判断链表中是否有环。 为了表示给定链表中的环&#xff0c;我们使用整数 pos 来表示链表尾连接到链表中的位置&#xff08;索引从 0 开始&#xff09;。 如果 pos 是 -1&#xff0c;则在该链表中没有环。 示例 1&#xff1a; 输入&#xf…

ASP.NET Core on K8S深入学习(9)Secret Configmap

本篇已加入《.NET Core on K8S学习实践系列文章索引》&#xff0c;可以点击查看更多容器化技术相关系列文章。01—Secret关于Secret在应用启动过程中需要一些敏感信息&#xff0c;比如数据库用户名、密码&#xff0c;如果直接明文存储在容器镜像中是不安全的&#xff0c;K8S提供…

生成函数简单入门

生成函数 可表示为F(x)∑nankn(x)F(x) \sum\limits_{n} a_n k_n(x)F(x)n∑​an​kn​(x)&#xff0c;对于不同类型的生成函数&#xff0c;有不同的核函数kn(x)k_n(x)kn​(x)。 普通生成函数&#xff1a;kn(x)xnk_n(x) x ^ nkn​(x)xn。 指数生成函数&#xff1a;kn(x)xnn!…

.NET Core 学习资料精选:进阶

2019.09月就要正式发布.NET 3.0了&#xff0c;对于前一篇博文《.NET Core 学习资料精选&#xff1a;入门》大家学的可还开心&#xff1f;这是本系列的第二篇文章&#xff1a;进阶篇&#xff0c;喜欢的园友速度学起来啊。对于还在使用传统.NET Framework 框架的园友&#xff0c;…

P4389 付公主的背包(生成函数,多项式exp)

P4389 付公主的背包 考虑生成函数有&#xff1a; ∏i1n11−xvi对其取对数得&#xff0c;∑i1nln⁡11−xviF(x)11−xv,G(x)ln⁡F(x)G(x)∫F′(x)F(x)dxG(x)∫vxv−11−xvdxG(x)∫∑n≥0vxvnv−1dxG(x)∑n≥0vxvnvvnvG(x)∑n≥0xv(n1)n1G(x)∑n≥1xvnn对于原式:∑i1n∑j1∞xvijj…

VS Code 1.38 发布!

今天&#xff08;北京时间 2019 年 9 月 5 日&#xff09;&#xff0c;微软发布了 Visual Studio Code 1.38 版本。此版本主要更新的内容包括&#xff1a;Preserve case for global search and replace - 进行全局替换字符串时保留大小写。Settings editor string array valida…

HDU 5730 Shell Necklace(生成函数 多项式求逆)

Shell Necklace 由题意可得f[n]∑i1na[i]f[n−i]f[n] \sum\limits_{i 1} ^{n} a[i] f[n - i]f[n]i1∑n​a[i]f[n−i]&#xff0c;设f[n]f[n]f[n]的生成函数为F(x)F(x)F(x)&#xff0c;a[n]a[n]a[n]的生成函数为A(n)A(n)A(n) F(x)A(x)∑n≥0xn∑ijnaifn−i由于a00&#xff0c…

.NET Core 收徒,有缘者,可破瓶颈

最近感悟天命&#xff0c;偶有所得&#xff0c;故而打算收徒若干&#xff0c;以继吾之传承。有缘者&#xff0c;可破瓶颈&#xff0c;职场巅峰指日可待。入门基本要求&#xff1a;1、工作经验&#xff1a;1年或以上。2、拜师费用&#xff1a;3999元&#xff08;RMB&#xff09;…

【全】Docker(二)-在Docker中部署Nginx实现负载均衡视频教程

一、前言在前面的文章中我们已经介绍了如何在Centos7系统中安装Docker以及利用Docker进行Asp.Net Core应用的部署。在本文中&#xff0c;我们将继续介绍利用Docker部署Nginx服务实现负载均衡。文章最后附有Nginx部署的视频全过程。注&#xff1a;查看公众号历史文章&#xff0c…

P2012 拯救世界2(指数型生成函数)

P2012 拯救世界2 三种基因&#xff0c;我们分别列出其生成函数&#xff1a; F(x)∑n≥0xnn!exG(x)∑n≥0x2n1(2n1)!12(∑n≥0xnn!−∑n≥0(−1)nxnn!)12(ex−e−x)H(x)∑n≥0x2n(2n)!12(∑n≥0xnn!∑n≥0(−1)nxnn!)12(exe−x)F(x) \sum_{n \geq 0} \frac{x ^ n}{n!} e ^ x\…