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 = << ;
const ll P = 998244353LL; int lim, pos[L]; inline ll fpow(ll x, ll y) {
ll res = ;
for (; y > ; y >>= ) {
if (y & ) res = res * x % P;
x = x * x % P;
}
return res;
} const ll inv2 = fpow(, P - ); 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 < ) x += P;
} inline void prework(int len) {
int l = ;
for (lim = ; lim < len; lim <<= , ++l);
for (int i = ; i < lim; i++)
pos[i] = (pos[i >> ] >> ) | ((i & ) << (l - ));
} inline void ntt(poly &c, int opt) {
c.resize(lim, );
for (int i = ; i < lim; i++)
if (i < pos[i]) swap(c[i], c[pos[i]]);
for (int i = ; i < lim; i <<= ) {
ll wn = fpow(, (P - ) / (i << ));
if (opt == -) wn = fpow(wn, P - );
for (int len = i << , j = ; j < lim; j += len) {
ll w = ;
for (int k = ; 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 == -) {
ll inv = fpow(lim, P - );
for (int i = ; 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() - );
ntt(u, ), ntt(v, );
for (int i = ; i < lim; i++) res.push_back(v[i] * u[i] % P);
ntt(res, -);
res.resize(u.size() + v.size() - );
return res;
} poly getInv(poly x, int len) {
x.resize(len);
if (len == ) {
poly res;
res.push_back(fpow(x[], P - ));
return res;
}
poly y = getInv(x, (len + ) >> );
prework(len << ); poly u = x, v = y, res;
ntt(u, ), ntt(v, );
for (int i = ; i < lim; i++) res.push_back(v[i] * (2LL - u[i] * v[i] % P + P) % P);
ntt(res, -); res.resize(len);
return res;
} inline void direv(poly &c) {
for (int i = ; i < (int)c.size() - ; i++)
c[i] = c[i + ] * (i + ) % P;
c[c.size() - ] = ;
} inline void integ(poly &c) {
for (int i = (int)c.size() - ; i > ; i--)
c[i] = c[i - ] * fpow(i, P - ) % P;
c[] = ;
} 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 == ) {
poly res;
res.push_back(sqrt(x[]));
return res;
}
poly y = getSqrt(x, (len + ) >> );
poly u = x, v = y, w, res;
w = getInv(y, len); prework(len << );
ntt(u, ), ntt(v, ), ntt(w, );
for (int i = ; i < lim; i++)
res.push_back((v[i] * v[i] % P + u[i]) % P * w[i] % P * inv2 % P);
ntt(res, -);
res.resize(len); return res;
} poly getExp(poly x, int len) {
x.resize(len, );
if (len == ) {
poly res;
res.push_back();
return res;
} poly y = getExp(x, (len + ) >> );
poly u = x, v = y, w = y, res;
w.resize(len, );
w = getLn(w); prework(len << );
u[] = (u[] + - w[] + P) % P;
for (int i = ; i < (int)u.size(); i++) u[i] = (u[i] - w[i] + P) % P; ntt(u, ), ntt(v, );
for (int i = ; i < lim; i++) res.push_back(u[i] * v[i] % P);
ntt(res, -); res.resize(len);
return res;
} inline poly fpow(poly x, ll y, int n) {
x = getLn(x);
for (int i = ; i < n; i++) x[i] = x[i] * y % P;
x = getExp(x, n);
return x;
} } template <typename T>
inline void read(T &X) {
X = ; char ch = ; T op = ;
for (; ch > ''|| ch < ''; ch = getchar())
if (ch == '-') op = -;
for (; ch >= '' && ch <= ''; ch = getchar())
X = (X << ) + (X << ) + ch - ;
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 = ; 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[], 1LL); /* for (int i = 0; i < n; i++)
printf("%I64d%c", a[i], " \n"[i == n - 1]); */ a = Poly :: getLn(a);
Poly :: inc(a[], 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 = ; i < n; i++)
printf("%lld%c", a[i], " \n"[i == n - ]);
return ;
}
COGS 2189 帕秋莉的超级多项式的更多相关文章
- 【Cogs2187】帕秋莉的超级多项式(多项式运算)
[Cogs2187]帕秋莉的超级多项式(多项式运算) 题面 Cogs 题解 多项式运算模板题 只提供代码了.. #include<iostream> #include<cstdio& ...
- COGS2187 [HZOI 2015] 帕秋莉的超级多项式
什么都别说了,咱心态已经炸了... question 题目戳这里的说... 其实就是叫你求下面这个式子的导函数: noteskey 其实是道板子题呢~ 刚好给我们弄个多项式合集的说... 各种板子粘贴 ...
- 【HZOI2015】帕秋莉的超级多项式
题面 题目分析 超级模板题: 多项式乘法 多项式求逆 多项式开根 多项式求导 多项式求积分 多项式求对数 多项式求自然对数为底的指数函数 多项式快速幂 代码实现 #include<iostrea ...
- cogs 998. [東方S2] 帕秋莉·诺蕾姬
二次联通门 : cogs 998. [東方S2] 帕秋莉·诺蕾姬 交上去后发现自己没上榜 就想着加点黑科技 把循环展开一下 结果WA了.. 万恶的姆Q /* cogs 998. [東方S2] 帕秋莉· ...
- P4910 帕秋莉的手环
题目背景 帕秋莉是蕾米莉亚很早结识的朋友,现在住在红魔馆地下的大图书馆里.不仅擅长许多魔法,还每天都会开发出新的魔法.只是身体比较弱,因为哮喘,会在咏唱符卡时遇到麻烦. 她所用的属性魔法,主要是生命和 ...
- [Luogu] P4910 帕秋莉的手环
题目背景 帕秋莉是蕾米莉亚很早结识的朋友,现在住在红魔馆地下的大图书馆里.不仅擅长许多魔法,还每天都会开发出新的魔法.只是身体比较弱,因为哮喘,会在咏唱符卡时遇到麻烦. 她所用的属性魔法,主要是生命和 ...
- P4915 帕秋莉的魔导书(动态开点线段树)
题目背景 帕秋莉有一个巨大的图书馆,里面有数以万计的书,其中大部分为魔导书. 题目描述 魔导书是一种需要钥匙才能看得懂的书,然而只有和书写者同等或更高熟练度的人才能看得见钥匙.因此,每本魔导书都有它自 ...
- 洛谷 P4910 帕秋莉的手环 矩阵乘法+快速幂详解
矩阵快速幂解法: 这是一个类似斐波那契数列的矩乘快速幂,所以推荐大家先做一下下列题目:(会了,差不多就是多倍经验题了) 注:如果你不会矩阵乘法,可以了解一下P3390的题解 P1939 [模板]矩阵加 ...
- P4915 帕秋莉的魔导书
题目链接 题意分析 当前等级为\(x\)的魔法书会对等级在\([x,inf]\)的所有人造成\(y\)的影响 所以除了求平均值之外 就是区间修改区间求和 需要使用动态开点 + 标记永久化 需要注意的是 ...
随机推荐
- python爬虫——多线程+协程(threading+gevent)
上一篇博客中我介绍了如何将爬虫改造为多进程爬虫,但是这种方法对爬虫效率的提升不是非常明显,而且占用电脑cpu较高,不是非常适用于爬虫.这篇博客中,我将介绍在爬虫中广泛运用的多线程+协程的解决方案,亲测 ...
- chaos-engineering 的一些开源工具
Chaos Monkey - A resiliency tool that helps applications tolerate random instance failures. The Simi ...
- C#对Jason序列化匿名对象
引用: using System.Web.Script.Serialization; 代码: var resp = new { flag = false, url = ConfigReader.Log ...
- XiaoMi Interview Log
面试题目 PHP 弱类型 实现? COW 写时复制 实现? COW的时候内存的变化 12 $a = $b = 1;$b = 2; 的内存变化 ? 提供一个rand()函数[函数输出0 - 正无穷] 想 ...
- 小米开源监控open-falcon
小米开源监控系统Open-Falcon安装使用笔记 07net01.com 发布于 2016-10-25 18:42:03 分类:IT技术 阅读(88) 评论 前言 近期爆出Zabbix有严重bug, ...
- java编码-多重(正常)
String ISO = "ISO-8859-1"; String UTF = "UTF-8"; String GBK = "GBK"; S ...
- 十、jdk工具之Jdb命令(The Java Debugger)
目录 一.jdk工具之jps(JVM Process Status Tools)命令使用 二.jdk命令之javah命令(C Header and Stub File Generator) 三.jdk ...
- HDU 4762 Cut the Cake(高精度)
Cut the Cake Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Tota ...
- 学习笔记之Android
Android 开发专区 - 开源中国社区 http://www.oschina.net/android 探索 Android Studio | Android Studio https://deve ...
- [Android] 开发第七天
在另一台机器上安装 Android-Studio ,结果卡在了 Gradle 的下载界面上,网上各种方案都试了一遍,最终解决办法是: 然后新建了一个 App ,创建了新的签名并上传到手机上,安装时直接 ...