COGS 2189 帕秋莉的超级多项式

2023-10-12 17:10

本文主要是介绍COGS 2189 帕秋莉的超级多项式,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

放模板啦!

以后打比赛的时候直接复制过来。

说句实话vector的效率真的不怎么样,但是似乎也还行,最主要是……写得比较爽。

#include <cstdio>
#include <cstring>
#include <algorithm>
#include <vector>
#include <cmath>
using namespace std;
typedef long long ll;
typedef vector <ll> poly;namespace Poly {const int L = 1 << 20;const ll P = 998244353LL;int lim, pos[L];inline ll fpow(ll x, ll y) {ll res = 1;for (; y > 0; y >>= 1) {if (y & 1) res = res * x % P;x = x * x % P;}return res;}const ll inv2 = fpow(2, P - 2);template <typename T>inline void inc(T &x, T y) {x += y;if (x >= P) x -= P;}template <typename T>inline void sub(T &x, T y) {x -= y;if (x < 0) x += P;}inline void prework(int len) {int l = 0;for (lim = 1; lim < len; lim <<= 1, ++l);for (int i = 0; i < lim; i++)pos[i] = (pos[i >> 1] >> 1) | ((i & 1) << (l - 1));}inline void ntt(poly &c, int opt) {c.resize(lim, 0);for (int i = 0; i < lim; i++)if (i < pos[i]) swap(c[i], c[pos[i]]);for (int i = 1; i < lim; i <<= 1) {ll wn = fpow(3, (P - 1) / (i << 1));if (opt == -1) wn = fpow(wn, P - 2);for (int len = i << 1, j = 0; j < lim; j += len) {ll w = 1;for (int k = 0; k < i; k++, w = w * wn % P) {ll x = c[j + k], y = w * c[j + k + i] % P;c[j + k] = (x + y) % P, c[j + k + i] = (x - y + P) % P;}}}if (opt == -1) {ll inv = fpow(lim, P - 2);for (int i = 0; i < lim; i++) c[i] = c[i] * inv % P;}}inline poly operator * (const poly &x, const poly &y) {poly res, u = x, v = y;prework(u.size() + v.size() - 1);ntt(u, 1), ntt(v, 1);for (int i = 0; i < lim; i++) res.push_back(v[i] * u[i] % P);ntt(res, -1);res.resize(u.size() + v.size() - 1);return res;}poly getInv(poly x, int len) {x.resize(len);if (len == 1) {poly res;res.push_back(fpow(x[0], P - 2));return res;}poly y = getInv(x, (len + 1) >> 1);prework(len << 1);poly u = x, v = y, res;ntt(u, 1), ntt(v, 1);for (int i = 0; i < lim; i++) res.push_back(v[i] * (2LL - u[i] * v[i] % P + P) % P);ntt(res, -1);res.resize(len);return res;}inline void direv(poly &c) {for (int i = 0; i < (int)c.size() - 1; i++)c[i] = c[i + 1] * (i + 1) % P;c[c.size() - 1] = 0;}inline void integ(poly &c) {for (int i = (int)c.size() - 1; i > 0; i--)c[i] = c[i - 1] * fpow(i, P - 2) % P;c[0] = 0;}inline poly getLn(poly c) {poly a = getInv(c, (int)c.size());poly b = c;direv(b);poly res = b * a;res.resize(c.size());integ(res);return res;}poly getSqrt(poly x, int len) {x.resize(len);if (len == 1) {poly res;res.push_back(sqrt(x[0]));return res;}poly y = getSqrt(x, (len + 1) >> 1);poly u = x, v = y, w, res;w = getInv(y, len);prework(len << 1);ntt(u, 1), ntt(v, 1), ntt(w, 1);for (int i = 0; i < lim; i++) res.push_back((v[i] * v[i] % P + u[i]) % P * w[i] % P * inv2 % P);ntt(res, -1);res.resize(len);return res;}poly getExp(poly x, int len) {x.resize(len, 0);if (len == 1) {poly res;res.push_back(1);return res;}poly y = getExp(x, (len + 1) >> 1);poly u = x, v = y, w = y, res;w.resize(len, 0);w = getLn(w);prework(len << 1);u[0] = (u[0] + 1 - w[0] + P) % P;for (int i = 1; i < (int)u.size(); i++) u[i] = (u[i] - w[i] + P) % P;ntt(u, 1), ntt(v, 1);for (int i = 0; i < lim; i++) res.push_back(u[i] * v[i] % P);ntt(res, -1);res.resize(len);return res;}inline poly fpow(poly x, ll y, int n) {x = getLn(x);for (int i = 0; i < n; i++) x[i] = x[i] * y % P;x = getExp(x, n);return x;}}template <typename T>
inline void read(T &X) {X = 0; char ch = 0; T op = 1;for (; ch > '9'|| ch < '0'; ch = getchar())if (ch == '-') op = -1;for (; ch >= '0' && ch <= '9'; ch = getchar())X = (X << 3) + (X << 1) + ch - 48;X *= op;
}int main() {
//    freopen("Sample.txt", "r", stdin);    freopen("polynomial.in", "r", stdin);freopen("polynomial.out", "w", stdout);int n, k;read(n), read(k);poly a; a.resize(n);for (int i = 0; i < n; i++) read(a[i]);a = Poly :: getSqrt(a, n);/*    for (int i = 0; i < n; i++)printf("%I64d%c", a[i], " \n"[i == n - 1]);    */a = Poly :: getInv(a, n);/*    for (int i = 0; i < n; i++)printf("%I64d%c", a[i], " \n"[i == n - 1]);   */Poly :: integ(a);/*    for (int i = 0; i < n; i++)printf("%I64d%c", a[i], " \n"[i == n - 1]);   */a = Poly :: getExp(a, n);/*    for (int i = 0; i < n; i++)printf("%I64d%c", a[i], " \n"[i == n - 1]);   */a = Poly :: getInv(a, n);Poly :: inc(a[0], 1LL);/*    for (int i = 0; i < n; i++)printf("%I64d%c", a[i], " \n"[i == n - 1]);    */a = Poly :: getLn(a);Poly :: inc(a[0], 1LL);/*    for (int i = 0; i < n; i++)printf("%I64d%c", a[i], " \n"[i == n - 1]);    */a = Poly :: fpow(a, k, n);/*    for (int i = 0; i < n; i++)printf("%I64d%c", a[i], " \n"[i == n - 1]);    */Poly :: direv(a);for (int i = 0; i < n; i++)printf("%lld%c", a[i], " \n"[i == n - 1]);return 0;
} 
View Code

 

转载于:https://www.cnblogs.com/CzxingcHen/p/10358153.html

这篇关于COGS 2189 帕秋莉的超级多项式的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/197255

相关文章

超级 密码加密 解密 源码,支持表情,符号,数字,字母,加密

超级 密码加密 解密 源码,支持表情,符号,数字,字母,加密 可以将表情,动物,水果,表情,手势,猫语,兽语,狗语,爱语,符号,数字,字母,加密和解密 可以将文字、字母、数字、代码、标点符号等内容转换成新的文字形式,通过简单的文字以不同的排列顺序来表达不同的内容 源码截图: https://www.httple.net/152649.html

【超级干货】2天速成PyTorch深度学习入门教程,缓解研究生焦虑

3、cnn基础 卷积神经网络 输入层 —输入图片矩阵 输入层一般是 RGB 图像或单通道的灰度图像,图片像素值在[0,255],可以用矩阵表示图片 卷积层 —特征提取 人通过特征进行图像识别,根据左图直的笔画判断X,右图曲的笔画判断圆 卷积操作 激活层 —加强特征 池化层 —压缩数据 全连接层 —进行分类 输出层 —输出分类概率 4、基于LeNet

印度再现超级大片,豪华阵容加顶级特效

最近,印度影坛再次掀起了风潮,一部名为《毗湿奴降临》的神话大片强势登陆各大影院,上映首周票房就飙升至105亿卢比,成功占据了票房榜首的位置。之后,这部电影也在北美上映,海外市场的表现同样不俗,收获了相当亮眼的票房成绩。作为一部印度神话科幻大片,《毗湿奴降临》不仅在本土大火,在国际市场上也引发了不小的关注。 《毗湿奴降临》由印度著名导演纳格·阿什温执导,卡司阵容极其豪华,集结了迪皮卡·帕度柯妮

linux普通用户和超级用户之间的切换

su -这样,就在当前目录下,变更成超级用户如果之前没有设置过超级用户密码的话需要使用sudo passwd root按照提示,如果是提示输入密码,就是你的用户密码然后提示输入 Unix密码确认Unix密码然后再使用我提供 su - 然后提示输入root密码,再然后就进入你要的root权限了 su- su shalimin

怎么将webp格式转换成jpg?这几种图片转换方法超级好用!

怎么将webp格式转换成jpg?WebP,这一较为边缘化的图像压缩技术,在实际应用中逐渐显现出其固有的局限,首要挑战便是其浏览器兼容性的不足,在多元化、全球化的网络生态中,这一短板尤为明显,用户常常面临因格式不支持而导致的分享与传播障碍,不得不采取迂回策略或依赖特定软件桥接这一鸿沟,更进一步,WebP图像编辑工具的稀缺,极大地限制了用户对其进行个性化编辑与创意发挥的空间,对于追求独特视觉表达和多样

算法笔记02--归纳法之多项式求值(Horner规则)

多项式求值 假设有n+2个实数a0,a1,...,an和x的序列,求多项式 p_nx = a_nx^n + a_n-1x^n-1 + ...+ a_1x + a_0; 则需要乘法:n+n-1 + ...+2+1 = n(n+1)/2 需要加法:n 可见算法效率为O(n^2) 而p_nx = ((...((((a_n)x + a_n-1)x + a_n-2)x + a_n-3)....)

【COGS】256 [POI2001] 金矿 线段树

传送门:【COGS】256 [POI2001] 金矿 题目分析:将每个点作为一个矩阵的右下角添加这个矩阵的下边以及上边,这样本题转化成了区间加减以及求区间最大的问题。 代码如下: #include <cstdio>#include <vector>#include <cstring>#include <algorithm>using namespace std

【COGS】421 [SDOI2009] HH的项链 树状数组

传送门:【COGS】421 [SDOI2009] HH的项链 题目分析:将区间以右端点为关键字降序排序,然后从左到右依次遍历每个数并插入到树状数组中,如果遍历到一个数的时候在他的前面已经有一个相同的数时,将之前位置上的数从树状数组中删除。然后我们每处理完一个位置上的数后,看这个位置上是否有右端点,如果有则做一次求和,这个右端点属于的区间【L,R】的值即sum(R)-sum(L-1)。

【COGS】577 蝗灾 cdq分治

传送门:【COGS】577 蝗灾 题目分析:cdq分治入门题= =。。。。用差分思想将矩阵分成四块来计算。。排序一维,另一维用树状数组解决。 代码如下: #include <cstdio>#include <vector>#include <cstring>#include <algorithm>using namespace std ;#define REP(

如何打造抗冲击的超级电容器?用啥材料好?

大家好,今天我们来聊聊超级电容器——《Impact-resistant supercapacitor by hydrogel-infused lattice》发表于《Nature Communications》。在新能源运输快速发展的当下,超级电容器的安全问题愈发重要。传统的保护方式存在不足,如何在不影响其轻便性和空间效率的前提下,增强超级电容器的可靠性呢?这篇文档提出了一种创新