什么都别说了,咱心态已经炸了...

question

题目戳这里的说...

其实就是叫你求下面这个式子的导函数:

noteskey

其实是道板子题呢~

刚好给我们弄个多项式合集的说...

各种板子粘贴的不亦乐乎结果一交发现自己 T 掉了,心态爆炸

斗胆把 YYB 大仙的代码交上去发现 A 掉了...(会不会被棕掉丫)

然后调了半天代码甚至还加了更多的优化结果发现跑得还是巨慢无比...

然后继续查 bug ,发现各种函数里面都没有区别,函数运行速度也差不了多少

于是只剩 NTT 里面的锅了,于是两份代码各跑 30 遍 NTT 看了看,发现自己的代码比 YYB 大仙的慢三倍! 然后各种心态爆炸...

于是终于怀疑起了最基本的函数: mul、inc、dec...

最后发现居然是 inc 和 dec 函数跑慢了! 心态怎能不炸!多年的信仰丫~

本以为取模速度超级慢三目速度超级快,结果...啪啪打脸(好吧其实是取模相对加减乘除慢,三目相对 if 语句快)

于是...就把三目改成取模瞬间 A 了此题 TAT

长教训了(但是感觉 inc 和 dec 的写法都改不了了怎么办...在线等)

code

总之和那位大佬说的一样,这种题拿来练手 (抄板子) 还行,比赛里面出来就准备好锤子把出题人胖揍一顿吧...

  1. //by Judge
  2. #include<bits/stdc++.h>
  3. #define Rg register
  4. #define fp(i,a,b) for(Rg int i=(a),I=(b)+1;i<I;++i)
  5. #define fd(i,a,b) for(Rg int i=(a),I=(b)-1;i>I;--i)
  6. #define ll long long
  7. using namespace std;
  8. const int mod=998244353;
  9. const int iG=332748118;
  10. const int M=3e5+3;
  11. typedef int arr[M];
  12. #ifndef Judge
  13. #define getchar() (p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<21,stdin),p1==p2)?EOF:*p1++)
  14. #endif
  15. char buf[1<<21],*p1=buf,*p2=buf;
  16. inline int inc(int x,int y){return (x+y)%mod;}
  17. inline int dec(int x,int y){return (x-y+mod)%mod;}
  18. inline int Dec(int x,int y){return x<y?x-y+mod:x-y;}
  19. inline int Inc(int x,int y){return x+y>=mod?x+y-mod:x+y;}
  20. inline int mul(int x,int y){return 1ll*x*y%mod;}
  21. inline int read(){ int x=0,f=1; char c=getchar();
  22. for(;!isdigit(c);c=getchar()) if(c=='-') f=-1;
  23. for(;isdigit(c);c=getchar()) x=x*10+c-'0'; return x*f;
  24. } char sr[1<<21],z[20];int CCF=-1,Z;
  25. inline void Ot(){fwrite(sr,1,CCF+1,stdout),CCF=-1;}
  26. inline void print(int x,char chr=' '){
  27. if(CCF>1<<20)Ot();if(x<0)sr[++CCF]=45,x=-x;
  28. while(z[++Z]=x%10+48,x/=10);
  29. while(sr[++CCF]=z[Z],--Z);sr[++CCF]=chr;
  30. } int n,k,d,limit; arr a,b,r[21],lg,inv,G[2];
  31. inline int qpow(Rg int x,Rg int p=mod-2,Rg int s=1){
  32. for(;p;p>>=1,x=mul(x,x)) if(p&1) s=mul(s,x); return s;
  33. }
  34. inline void prep(int n){
  35. inv[1]=1; for(limit=1;limit<=n;limit<<=1);
  36. fp(i,2,limit) inv[i]=mul(mod-mod/i,inv[mod%i]);
  37. fp(d,1,19){ lg[1<<d]=d; fp(i,0,(1<<d)-1)
  38. r[d][i]=(r[d][i>>1]>>1)|((i&1)<<(d-1));
  39. }
  40. for(Rg int t=(mod-1)>>1,i=1,x,y;i<262144;i<<=1,t>>=1){
  41. x=qpow(3,t),y=qpow(iG,t),G[0][i]=G[1][i]=1;
  42. fp(k,1,i-1) G[1][i+k]=mul(G[1][i+k-1],x),G[0][i+k]=mul(G[0][i+k-1],y);
  43. }
  44. }
  45. inline void NTT(int* a,int tp){
  46. fp(i,0,limit-1) if(i<r[d][i]) swap(a[i],a[r[d][i]]);
  47. for(Rg int mid=1;mid<limit;mid<<=1){ int I=mid<<1;
  48. for(Rg int j=0,x,y;j<limit;j+=I) fp(k,0,mid-1)
  49. x=a[j+k],y=mul(G[tp][mid+k],a[j+k+mid]),
  50. a[j+k]=(x+y)%mod,a[j+k+mid]=(x-y+mod)%mod;
  51. }
  52. if(tp) return ; fp(i,0,limit-1) a[i]=mul(a[i],inv[limit]);
  53. }
  54. inline void init(Rg int n){ d=0;
  55. for(limit=1;limit<=n;limit<<=1)++d;
  56. }
  57. void Inv(int* a,int* b,int n){
  58. static arr C,D; if(n==1) return b[0]=qpow(a[0]),void();
  59. Inv(a,b,n>>1),init(n); fp(i,0,n-1) C[i]=a[i],D[i]=b[i];
  60. fp(i,n,limit-1) C[i]=D[i]=0; NTT(C,1),NTT(D,1);
  61. fp(i,0,limit-1) C[i]=mul(C[i],mul(D[i],D[i])); NTT(C,0);
  62. fp(i,0,n-1) b[i]=dec(inc(b[i],b[i]),C[i]); fp(i,n,limit-1) b[i]=0;
  63. }
  64. void Sqrt(int* a,int* b,int n){
  65. static arr D,F; if(n==1) return b[0]=sqrt(a[0]),void();
  66. Sqrt(a,b,n>>1); fp(i,0,n<<1) F[i]=0;
  67. Inv(b,F,n),init(n); fp(i,0,n-1) D[i]=a[i];
  68. fp(i,n,limit-1) D[i]=0; NTT(D,1),NTT(b,1),NTT(F,1);
  69. fp(i,0,limit-1) b[i]=mul(inc(b[i],mul(D[i],F[i])),inv[2]);
  70. NTT(b,0); fp(i,n,limit-1) b[i]=0;
  71. memset(D,0,limit<<2),memset(F,0,limit<<2);
  72. }
  73. inline void Direv(int* a,int* b,int n){
  74. fp(i,1,n-1) b[i-1]=mul(a[i],i); b[n-1]=b[n]=0;
  75. }
  76. inline void Inter(int* a,int* b,int n){
  77. fp(i,1,n-1) b[i]=mul(a[i-1],inv[i]); b[0]=0;
  78. }
  79. inline void Ln(int* a,int* b,int n){
  80. static arr A,B; Direv(a,A,n),Inv(a,B,n);
  81. init(n),NTT(A,1),NTT(B,1);
  82. fp(i,0,limit-1) A[i]=mul(A[i],B[i]);
  83. NTT(A,0),Inter(A,b,limit);
  84. memset(A,0,limit<<2),memset(B,0,limit<<2);
  85. }
  86. inline void Exp(int* a,int* b,int n){
  87. static arr F; if(n==1) return b[0]=1,void();
  88. Exp(a,b,n>>1),Ln(b,F,n),init(n);
  89. F[0]=dec(a[0]+1,F[0]); fp(i,1,n-1) F[i]=dec(a[i],F[i]);
  90. NTT(F,1),NTT(b,1); fp(i,0,limit-1) b[i]=mul(b[i],F[i]);
  91. NTT(b,0); fp(i,n,limit-1) b[i]=0; memset(F,0,limit<<2);
  92. }
  93. inline void Pow(int* a,int* b,int n,int k){
  94. static arr F; memset(F,0,n<<2),Ln(a,F,n);
  95. fp(i,0,n-1) F[i]=mul(F[i],k); Exp(F,b,n);
  96. }
  97. int main(){
  98. #ifndef Judge
  99. freopen("polynomial.in","r",stdin);
  100. freopen("polynomial.out","w",stdout);
  101. #else
  102. freopen("1.in","r",stdin);
  103. freopen("1.out","w",stdout);
  104. #endif
  105. n=read(),k=read(),prep(n<<1);
  106. fp(i,0,n-1) a[i]=read(); int len;
  107. for(len=1;len<=n;len<<=1);
  108. Sqrt(a,b,len),memset(a,0,len<<2);
  109. Inv(b,a,len),memset(b,0,len<<2);
  110. Inter(a,b,n),memset(a,0,len<<2);
  111. Exp(b,a,len),memset(b,0,len<<2);
  112. Inv(a,b,len),memset(a,0,len<<2);
  113. b[0]=inc(b[0],1);
  114. Ln(b,a,len),memset(b,0,len<<2);
  115. a[0]=inc(a[0],1);
  116. Pow(a,b,len,k),memset(a,0,len<<2);
  117. Direv(b,a,n);
  118. fp(i,0,n-1) print(a[i]); return Ot(),0;
  119. }

COGS2187 [HZOI 2015] 帕秋莉的超级多项式的更多相关文章

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

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

  2. COGS 2189 帕秋莉的超级多项式

    放模板啦! 以后打比赛的时候直接复制过来. 说句实话vector的效率真的不怎么样,但是似乎也还行,最主要是……写得比较爽. #include <cstdio> #include < ...

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

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

  4. P4910 帕秋莉的手环

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

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

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

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

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

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

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

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

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

  9. P4915 帕秋莉的魔导书

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

随机推荐

  1. MySQL数据库日志文件(redo与undo)

    +++++++++++++++++++++++++++++++++++++++++++标题:MySQL数据库日志文件时间:2019年2月25日内容:MySQL数据库日志文件(redo日志和undo日志 ...

  2. 初识Haskell 五:自定义数据类型和类型类

    对Discrete Mathematics Using a Computer的第一章Introduction to Haskell进行总结.环境Windows 自定义数据类型 data type de ...

  3. webpack code splitting

    一.代码分割优化 const webpack = require('webpack'); const HtmlWebpackPlugin = require('html-webpack-plugin' ...

  4. SpringBoot+AOP整合

    SpringBoot+AOP整合 https://blog.csdn.net/lmb55/article/details/82470388 https://www.cnblogs.com/onlyma ...

  5. Flask--偏函数, 线程安全, 请求上下文

    一 . 偏函数 from functools import partial def func(a, b): return a + b new_func = partial(func, 3, 4) # ...

  6. Python基础:第一个Python程序(2)

    1.Python Shell 1.1 Windows命令 (1)[开始]|[运行],输入cmd回车,进入Windows命令界面. (2)输入python,回车,进入Python Shell. 1.2 ...

  7. setData 和 直接赋值的区别

    wxml: <view> <block wx:for="{{dataArray}}" wx:key="id"> <v-book b ...

  8. 数据库设计很棒的参考CDM-PDM-LDM-PowerDesigner

    此页面显示了涵盖主题领域的  50 个类别中的行业特定数据模型列表,用于创建企业数据模型. 以下是我们所有 1,700 多种数据模型的字母顺序列表 1. 广告 1. 顾客 1. 派对 1.   广告中 ...

  9. bzoj1997 Planar

    题目链接 思路 首先以那个环为框架,把所有的边连出来.如果有两条边相交,那么就把其中一条放到环外面去. 如图: \((1,3)\)与\((2,5)相交,\)(1,4)\(与\)(2,5)相交.所以我们 ...

  10. halcon+WinForm打开摄像头

    注意引用halcon.dll,项目属性平台一致(X64) using HalconDotNet;//引用halcon using System.Threading;//引用线程 namespace M ...