题意

题目链接

Sol

\(B(x) = \exp(K\ln(A(x)))\)

做完了。。。

复杂度\(O(n\log n)\)

  1. // luogu-judger-enable-o2
  2. // luogu-judger-enable-o2
  3. #include<bits/stdc++.h>
  4. #define Pair pair<int, int>
  5. #define MP(x, y) make_pair(x, y)
  6. #define fi first
  7. #define se second
  8. #define LL long long
  9. #define ull unsigned long long
  10. #define Fin(x) {freopen(#x".in","r",stdin);}
  11. #define Fout(x) {freopen(#x".out","w",stdout);}
  12. using namespace std;
  13. const int MAXN = 4e5 + 10, INF = 1e9 + 10, INV2 = 499122177;
  14. const double eps = 1e-9, pi = acos(-1);
  15. const int G = 3, mod = 998244353;
  16. inline int read() {
  17. char c = getchar(); int x = 0, f = 1;
  18. while(c < '0' || c > '9') {if(c == '-') f = -1; c = getchar();}
  19. while(c >= '0' && c <= '9') x = (1ll * x * 10 + c - '0') % mod, c = getchar();
  20. return x * f;
  21. }
  22. int N, K, a[MAXN], b[MAXN];
  23. namespace Poly {
  24. int rev[MAXN], GPow[MAXN], A[MAXN], B[MAXN], C[MAXN], lim;
  25. template <typename A, typename B> inline LL add(A x, B y) {if(x + y < 0) return x + y + mod; return x + y >= mod ? x + y - mod : x + y;}
  26. template <typename A, typename B> inline void add2(A &x, B y) {if(x + y < 0) x = x + y + mod; else x = (x + y >= mod ? x + y - mod : x + y);}
  27. template <typename A, typename B> inline LL mul(A x, B y) {return 1ll * x * y % mod;}
  28. template <typename A, typename B> inline void mul2(A &x, B y) {x = (1ll * x * y % mod + mod) % mod;}
  29. int fp(int a, int p, int P = mod) {
  30. int base = 1;
  31. for(; p; p >>= 1, a = 1ll * a * a % P) if(p & 1) base = 1ll * base * a % P;
  32. return base;
  33. }
  34. int GetLen(int x) {
  35. int lim = 1;
  36. while(lim <= x) lim <<= 1;
  37. return lim;
  38. }
  39. int GetLen2(int x) {
  40. int lim = 1;
  41. while(lim <= x) lim <<= 1;
  42. return lim;
  43. }
  44. int GetOrigin(int x) {//¼ÆËãÔ­¸ù
  45. static int q[MAXN]; int tot = 0, tp = x - 1;
  46. for(int i = 2; i * i <= tp; i++) if(!(tp % i)) {q[++tot] = i;while(!(tp % i)) tp /= i;}
  47. if(tp > 1) q[++tot] = tp;
  48. for(int i = 2, j; i <= x - 1; i++) {
  49. for(j = 1; j <= tot; j++) if(fp(i, (x - 1) / q[j], x) == 1) break;
  50. if(j == tot + 1) return i;
  51. }
  52. }
  53. void Init(int Lim) {
  54. for(int i = 1; i <= Lim; i++) GPow[i] = fp(G, (mod - 1) / i);
  55. }
  56. void NTT(int *A, int lim, int opt) {
  57. int len = 0; for(int N = 1; N < lim; N <<= 1) ++len;
  58. for(int i = 1; i <= lim; i++) rev[i] = (rev[i >> 1] >> 1) | ((i & 1) << (len - 1));
  59. for(int i = 0; i <= lim; i++) if(i < rev[i]) swap(A[i], A[rev[i]]);
  60. for(int mid = 1; mid < lim; mid <<= 1) {
  61. int Wn = GPow[mid << 1];
  62. for(int i = 0; i < lim; i += (mid << 1)) {
  63. for(int j = 0, w = 1; j < mid; j++, w = mul(w, Wn)) {
  64. int x = A[i + j], y = mul(w, A[i + j + mid]);
  65. A[i + j] = add(x, y), A[i + j + mid] = add(x, -y);
  66. }
  67. }
  68. }
  69. if(opt == -1) {
  70. reverse(A + 1, A + lim);
  71. int Inv = fp(lim, mod - 2);
  72. for(int i = 0; i <= lim; i++) mul2(A[i], Inv);
  73. }
  74. }
  75. void Mul(int *a, int *b, int N, int M) {
  76. memset(A, 0, sizeof(A)); memset(B, 0, sizeof(B));
  77. int lim = 1, len = 0;
  78. while(lim <= N + M) len++, lim <<= 1;
  79. for(int i = 0; i <= N; i++) A[i] = a[i];
  80. for(int i = 0; i <= M; i++) B[i] = b[i];
  81. NTT(A, lim, 1); NTT(B, lim, 1);
  82. for(int i = 0; i <= lim; i++) B[i] = mul(B[i], A[i]);
  83. NTT(B, lim, -1);
  84. for(int i = 0; i <= N + M; i++) b[i] = B[i];
  85. memset(A, 0, sizeof(A)); memset(B, 0, sizeof(B));
  86. }
  87. void Inv(int *a, int *b, int len) {//B1 = 2B - A1 * B^2
  88. if(len == 1) {b[0] = fp(a[0], mod - 2); return ;}
  89. Inv(a, b, len >> 1);
  90. for(int i = 0; i < len; i++) A[i] = a[i], B[i] = b[i];
  91. NTT(A, len << 1, 1); NTT(B, len << 1, 1);
  92. for(int i = 0; i < (len << 1); i++) mul2(A[i], mul(B[i], B[i]));
  93. NTT(A, len << 1, -1);
  94. for(int i = 0; i < len; i++) add2(b[i], add(b[i], -A[i]));
  95. for(int i = 0; i < (len << 1); i++) A[i] = B[i] = 0;
  96. }
  97. void Dao(int *a, int *b, int len) {
  98. for(int i = 1; i < len; i++) b[i - 1] = mul(i, a[i]); b[len - 1] = 0;
  99. }
  100. void Ji(int *a, int *b, int len) {
  101. for(int i = 1; i < len; i++) b[i] = mul(a[i - 1], fp(i, mod - 2)); b[0] = 0;
  102. }
  103. void Ln(int *a, int *b, int len) {//G(A) = \frac{A}{A'} qiudao zhihou jifen
  104. static int A[MAXN], B[MAXN];
  105. Dao(a, A, len);
  106. Inv(a, B, len);
  107. NTT(A, len << 1, 1); NTT(B, len << 1, 1);
  108. for(int i = 0; i < (len << 1); i++) B[i] = mul(A[i], B[i]);
  109. NTT(B, len << 1, -1);
  110. Ji(B, b, len << 1);
  111. memset(A, 0, sizeof(A)); memset(B, 0, sizeof(B));
  112. }
  113. void Exp(int *a, int *b, int len) {//F(x) = F_0 (1 - lnF_0 + A) but code ..why....
  114. if(len == 1) return (void) (b[0] = 1);
  115. Exp(a, b, len >> 1); Ln(b, C, len);
  116. C[0] = add(a[0] + 1, -C[0]);
  117. for(int i = 1; i < len; i++) C[i] = add(a[i], -C[i]);
  118. NTT(C, len << 1, 1); NTT(b, len << 1, 1);
  119. for(int i = 0; i < (len << 1); i++) mul2(b[i], C[i]);
  120. NTT(b, len << 1, -1);
  121. for(int i = len; i < (len << 1); i++) C[i] = b[i] = 0;
  122. }
  123. void Sqrt(int *a, int *b, int len) {
  124. static int B[MAXN];
  125. Ln(a, B, len);
  126. for(int i = 0; i < len; i++) B[i] = mul(B[i], INV2);
  127. Exp(B, b, len);
  128. }
  129. void Div(int *F, int *G, int *Q, int *R, int N, int M) {//F(n) = G(m) * Q(n - m + 1) + R(m)
  130. static int Ginv[MAXN]; memset(Ginv, 0, sizeof(Ginv));
  131. reverse(F, F + N + 1); reverse(G, G + M + 1);
  132. Inv(G, Ginv, GetLen2(N - M));//why not M
  133. Mul(F, Ginv, N - M, N - M);
  134. for(int i = 0; i <= N - M; i++) Q[i] = Ginv[i];
  135. reverse(Q, Q + N - M + 1);
  136. reverse(F, F + N + 1); reverse(G, G + M + 1);
  137. Mul(Q, G, N - M, M);
  138. for(int i = 0; i < M; i++) R[i] = add(F[i], -G[i]);
  139. }
  140. void Pow(int *a, int *b, int P, int N, int len) {
  141. static int tx[MAXN], ty[MAXN]; memset(tx, 0, sizeof(tx)); memset(ty, 0, sizeof(ty));
  142. Ln(a, tx, len);
  143. for(int i = 0; i < N; i++) ty[i] = mul(P, tx[i]);
  144. Exp(ty, b, len);
  145. }
  146. };
  147. using namespace Poly;
  148. signed main() {
  149. N = read(); K = read();
  150. Init(4 * N);
  151. for(int i = 0; i < N; i++) a[i] = read();
  152. Pow(a, b, K, N, GetLen(N));
  153. for(int i = 0; i < N; i++) cout << b[i] << ' ';
  154. return 0;
  155. }
  156. /*
  157. 4 1242412412412412412421421
  158. 1 1 0 0
  159. */

洛谷P5245 【模板】多项式快速幂(多项式ln 多项式exp)的更多相关文章

  1. 【洛谷P3390】矩阵快速幂

    矩阵快速幂 题目描述 矩阵乘法: A[n*m]*B[m*k]=C[n*k]; C[i][j]=sum(A[i][1~n]+B[1~n][j]) 为了便于赋值和定义,我们定义一个结构体储存矩阵: str ...

  2. 洛谷 P1965 转圈游戏 —— 快速幂

    题目:https://www.luogu.org/problemnew/show/P1965 居然真的就只是 ( x + m * 10k % n ) % n 代码如下: #include<ios ...

  3. 洛谷 P1226 【模板】快速幂||取余运算

    题目链接 https://www.luogu.org/problemnew/show/P1226 题目描述 输入b,p,k的值,求b^p mod k的值.其中b,p,k*k为长整型数. 输入输出格式 ...

  4. [SDOI2015]序列统计(多项式快速幂)

    题目描述 小C有一个集合S,里面的元素都是小于M的非负整数.他用程序编写了一个数列生成器,可以生成一个长度为N的数列,数列中的每个数都属于集合S.小C用这个生成器生成了许多这样的数列.但是小C有一个问 ...

  5. 【xsy2479】counting 生成函数+多项式快速幂

    题目大意:在字符集大小为$m$的情况下,有多少种构造长度为$n$的字符串$s$的方案,使得$C(s)=k$.其中$C(s)$表示字符串$s$中出现次数最多的字符的出现次数. 对$998244353$取 ...

  6. 【bzoj3684】 大朋友和多叉树 生成函数+多项式快速幂+拉格朗日反演

    这题一看就觉得是生成函数的题... 我们不妨去推下此题的生成函数,设生成函数为$F(x)$,则$[x^s]F(x)$即为答案. 根据题意,我们得到 $F(x)=x+\sum_{i∈D} F^i(x)$ ...

  7. BZOJ3645: Maze(FFT多项式快速幂)

    Description 众维拉先后在中土大陆上创造了精灵.人类以及矮人,其中矮人是生性喜好常年居住在地下的洞穴的存在,他们挖掘矿物甚至宝石,甚至用他们的勤劳勇敢智慧在地底下创造出了辉煌宏大的宫殿,错综 ...

  8. AtCoder AGC019E Shuffle and Swap (DP、FFT、多项式求逆、多项式快速幂)

    题目链接 https://atcoder.jp/contests/agc019/tasks/agc019_e 题解 tourist的神仙E题啊做不来做不来--这题我好像想歪了啊= =-- 首先我们可以 ...

  9. luoguP5219 无聊的水题 I 多项式快速幂

    有一个幼儿园容斥:最大次数恰好为 $m=$  最大次数最多为 $m$ - 最大次数最多为 $m-1$. 然后来一个多项式快速幂就好了. code: #include <cmath> #in ...

  10. 洛谷P3373 [模板]线段树 2(区间增减.乘 区间求和)

    To 洛谷.3373 [模板]线段树2 题目描述 如题,已知一个数列,你需要进行下面两种操作: 1.将某区间每一个数加上x 2.将某区间每一个数乘上x 3.求出某区间每一个数的和 输入输出格式 输入格 ...

随机推荐

  1. 解决微信小程序登录与发布的一些问题

    解决微信小程序的问题 图片在电脑上显示但在手机上却无法显示的问题 要使用的是本地图片,不想把图片上传到网络再通过https的方式解决,解决方法如下: 1.image src中的图片地址对英文字母大小写 ...

  2. puppet-type

    puppet语法-type Table of Contents Custom Source 基本技能要求 Types简介 Type-Documentation Type-Properties Type ...

  3. 常见排序算法整理(python实现 持续更新)

    1 快速排序 快速排序是对冒泡排序的一种改进.  它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行 ...

  4. Python档案袋( Sys 与 Import 模块)

    Sys模块: 获取Python有关的环境变量: import sys #得到Python的一些相关路径,环境变量 #其中site-packages目录存放的是一些第三方库 #其中lib目录存放的是一些 ...

  5. volatile和synchronized关键字

    synchronized java课上讲到过synchronized 首先看看用synchronized和没用synchronized的区别 import lombok.Getter; /** * @ ...

  6. vis.js没有中文文档,个人在项目中总结的一些中文配置

    ##vis.js var options = { nodes:{//节点配置 borderWidth: 1,//节点边框的宽度,单位为px borderWidthSelected: 2,节点被选中时边 ...

  7. 微服务架构下分布式事务解决方案——阿里GTS

    1 微服务的发展 微服务倡导将复杂的单体应用拆分为若干个功能简单.松耦合的服务,这样可以降低开发难度.增强扩展性.便于敏捷开发.当前被越来越多的开发者推崇,很多互联网行业巨头.开源社区等都开始了微服务 ...

  8. Linux编程 20 shell编程(shell脚本创建,echo显示信息)

    一概述 前面19章里已经掌握了linux系统和命令行的基础知识,从本章开始继续学习shell脚本的基础知识.在大量编辑shell脚本前,先来学习下一些基本概念. 1.1    使用多个命令 Shell ...

  9. sql server 性能调优之 逻辑内存消耗最大资源分析1 (自sqlserver服务启动以后)

    一.概述 IO 内存是sql server最重要的资源,数据从磁盘加载到内存,再从内存中缓存,输出到应用端,在sql server 内存初探中有介绍.在明白了sqlserver内存原理后,就能更好的分 ...

  10. 我可能不懂Array.prototype.sort

    今天 fix 我们后台系统的一些 bug.系统是基于 beego 和模板开发的,各种前后端代码揉作一团,没有格式,没有 eslint,全局变量满天飞,连 js 代码都有后端的插值,读起来非常 酸爽. ...