放模板啦!

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

说句实话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 帕秋莉的超级多项式的更多相关文章

  1. 【Cogs2187】帕秋莉的超级多项式(多项式运算)

    [Cogs2187]帕秋莉的超级多项式(多项式运算) 题面 Cogs 题解 多项式运算模板题 只提供代码了.. #include<iostream> #include<cstdio& ...

  2. COGS2187 [HZOI 2015] 帕秋莉的超级多项式

    什么都别说了,咱心态已经炸了... question 题目戳这里的说... 其实就是叫你求下面这个式子的导函数: noteskey 其实是道板子题呢~ 刚好给我们弄个多项式合集的说... 各种板子粘贴 ...

  3. 【HZOI2015】帕秋莉的超级多项式

    题面 题目分析 超级模板题: 多项式乘法 多项式求逆 多项式开根 多项式求导 多项式求积分 多项式求对数 多项式求自然对数为底的指数函数 多项式快速幂 代码实现 #include<iostrea ...

  4. cogs 998. [東方S2] 帕秋莉·诺蕾姬

    二次联通门 : cogs 998. [東方S2] 帕秋莉·诺蕾姬 交上去后发现自己没上榜 就想着加点黑科技 把循环展开一下 结果WA了.. 万恶的姆Q /* cogs 998. [東方S2] 帕秋莉· ...

  5. P4910 帕秋莉的手环

    题目背景 帕秋莉是蕾米莉亚很早结识的朋友,现在住在红魔馆地下的大图书馆里.不仅擅长许多魔法,还每天都会开发出新的魔法.只是身体比较弱,因为哮喘,会在咏唱符卡时遇到麻烦. 她所用的属性魔法,主要是生命和 ...

  6. [Luogu] P4910 帕秋莉的手环

    题目背景 帕秋莉是蕾米莉亚很早结识的朋友,现在住在红魔馆地下的大图书馆里.不仅擅长许多魔法,还每天都会开发出新的魔法.只是身体比较弱,因为哮喘,会在咏唱符卡时遇到麻烦. 她所用的属性魔法,主要是生命和 ...

  7. P4915 帕秋莉的魔导书(动态开点线段树)

    题目背景 帕秋莉有一个巨大的图书馆,里面有数以万计的书,其中大部分为魔导书. 题目描述 魔导书是一种需要钥匙才能看得懂的书,然而只有和书写者同等或更高熟练度的人才能看得见钥匙.因此,每本魔导书都有它自 ...

  8. 洛谷 P4910 帕秋莉的手环 矩阵乘法+快速幂详解

    矩阵快速幂解法: 这是一个类似斐波那契数列的矩乘快速幂,所以推荐大家先做一下下列题目:(会了,差不多就是多倍经验题了) 注:如果你不会矩阵乘法,可以了解一下P3390的题解 P1939 [模板]矩阵加 ...

  9. P4915 帕秋莉的魔导书

    题目链接 题意分析 当前等级为\(x\)的魔法书会对等级在\([x,inf]\)的所有人造成\(y\)的影响 所以除了求平均值之外 就是区间修改区间求和 需要使用动态开点 + 标记永久化 需要注意的是 ...

随机推荐

  1. CSS基础知识,学前准备

    1.引入层叠样式表: A.行内引入 <bodystyle="background-color:#cccccc">; 在标签内使用style属性 </body> ...

  2. DesignPattern(四)结构型模式(下)

    上篇链接  https://www.cnblogs.com/qixinbo/p/9023764.html 继续介绍最后三种结构型模式 外观模式 外观模式,也称作 ”门面“模式,在系统中,客户端经常需要 ...

  3. test20181024 kun

    题意 分析 考场做法 任意状态只有两种决策,进栈或出栈. 由于元素互不相同,所以选择的关键在于栈顶元素是否在它和带插入元素组成的集合中是最大的. 用stack和set维护.时间复杂度\(O(n \lo ...

  4. nats 学习 集群ha 配置

      nats 的ha 是一个mesh 的结构,有两个主要的参数 clusters routers 启动三分节点(单机) 共享变量 SERVERS=nats://127.0.0.1:6222,nats: ...

  5. python和C语言互相调用的几种方式

    ? 1 2 3 4 5 6 7 8 9 版权申明:本文为博主窗户(Colin Cai)原创,欢迎转帖.如要转贴,必须注明原文网址   http://www.cnblogs.com/Colin-Cai/ ...

  6. MYSQL中写SQL语句,取到表中按ID降序排列(最新纪录排在第一行)

    'select * from bugdata where id>0 order by id desc'

  7. HDU-6156 Palindrome Function(数位DP)

    一.题目 二.思路 1.这是很明显的数位DP: 2.和以往数位DP不同的是,这里带了个进制进来,而以往做是纯十进制下或者纯二进制下做操作.但是,不管多少进制,原理都是一样的: 3.这里有个小坑,题目中 ...

  8. python报头解决粘包简单实现

    client------------- #!/usr/bin/env python # encoding: utf-8  # Date: 2018/6/5 import socketimport st ...

  9. 自己动手实现RPC服务调用框架

    转自:http://www.cnblogs.com/rjzheng/p/8971629.html#3977269 担心后面忘了,先转了,后面借鉴实现一下RPC -------------------- ...

  10. HyberLedger Fabric学习(3)-chaincode学习(开发者)

    参考:http://hyperledger-fabric.readthedocs.io/en/latest/chaincode4ade.html chaincode是由go语言写的,实现了定义的接口. ...