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

2023-10-12 17:10

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

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

question

题目戳这里的说...

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

20160326162626_94531.png

noteskey

其实是道板子题呢~

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

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

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

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

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

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

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

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

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

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

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

code

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

//by Judge
#include<bits/stdc++.h>
#define Rg register
#define fp(i,a,b) for(Rg int i=(a),I=(b)+1;i<I;++i)
#define fd(i,a,b) for(Rg int i=(a),I=(b)-1;i>I;--i)
#define ll long long
using namespace std;
const int mod=998244353;
const int iG=332748118;
const int M=3e5+3;
typedef int arr[M];
#ifndef Judge
#define getchar() (p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<21,stdin),p1==p2)?EOF:*p1++)
#endif
char buf[1<<21],*p1=buf,*p2=buf;
inline int inc(int x,int y){return (x+y)%mod;}
inline int dec(int x,int y){return (x-y+mod)%mod;}
inline int Dec(int x,int y){return x<y?x-y+mod:x-y;}
inline int Inc(int x,int y){return x+y>=mod?x+y-mod:x+y;}
inline int mul(int x,int y){return 1ll*x*y%mod;}
inline int read(){ int x=0,f=1; char c=getchar();for(;!isdigit(c);c=getchar()) if(c=='-') f=-1;for(;isdigit(c);c=getchar()) x=x*10+c-'0'; return x*f;
} char sr[1<<21],z[20];int CCF=-1,Z;
inline void Ot(){fwrite(sr,1,CCF+1,stdout),CCF=-1;}
inline void print(int x,char chr=' '){if(CCF>1<<20)Ot();if(x<0)sr[++CCF]=45,x=-x;while(z[++Z]=x%10+48,x/=10);while(sr[++CCF]=z[Z],--Z);sr[++CCF]=chr;
} int n,k,d,limit; arr a,b,r[21],lg,inv,G[2];
inline int qpow(Rg int x,Rg int p=mod-2,Rg int s=1){for(;p;p>>=1,x=mul(x,x)) if(p&1) s=mul(s,x); return s;
}
inline void prep(int n){inv[1]=1; for(limit=1;limit<=n;limit<<=1);fp(i,2,limit) inv[i]=mul(mod-mod/i,inv[mod%i]);fp(d,1,19){ lg[1<<d]=d; fp(i,0,(1<<d)-1)r[d][i]=(r[d][i>>1]>>1)|((i&1)<<(d-1));}for(Rg int t=(mod-1)>>1,i=1,x,y;i<262144;i<<=1,t>>=1){x=qpow(3,t),y=qpow(iG,t),G[0][i]=G[1][i]=1;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);}
}
inline void NTT(int* a,int tp){fp(i,0,limit-1) if(i<r[d][i]) swap(a[i],a[r[d][i]]);for(Rg int mid=1;mid<limit;mid<<=1){ int I=mid<<1;for(Rg int j=0,x,y;j<limit;j+=I) fp(k,0,mid-1)x=a[j+k],y=mul(G[tp][mid+k],a[j+k+mid]),a[j+k]=(x+y)%mod,a[j+k+mid]=(x-y+mod)%mod;}if(tp) return ; fp(i,0,limit-1) a[i]=mul(a[i],inv[limit]);
}
inline void init(Rg int n){ d=0;for(limit=1;limit<=n;limit<<=1)++d;
}
void Inv(int* a,int* b,int n){static arr C,D; if(n==1) return b[0]=qpow(a[0]),void();Inv(a,b,n>>1),init(n); fp(i,0,n-1) C[i]=a[i],D[i]=b[i];fp(i,n,limit-1) C[i]=D[i]=0; NTT(C,1),NTT(D,1);fp(i,0,limit-1) C[i]=mul(C[i],mul(D[i],D[i])); NTT(C,0);fp(i,0,n-1) b[i]=dec(inc(b[i],b[i]),C[i]); fp(i,n,limit-1) b[i]=0;
}
void Sqrt(int* a,int* b,int n){static arr D,F; if(n==1) return b[0]=sqrt(a[0]),void();Sqrt(a,b,n>>1); fp(i,0,n<<1) F[i]=0;Inv(b,F,n),init(n); fp(i,0,n-1) D[i]=a[i];fp(i,n,limit-1) D[i]=0; NTT(D,1),NTT(b,1),NTT(F,1);fp(i,0,limit-1) b[i]=mul(inc(b[i],mul(D[i],F[i])),inv[2]);NTT(b,0); fp(i,n,limit-1) b[i]=0;memset(D,0,limit<<2),memset(F,0,limit<<2);
}
inline void Direv(int* a,int* b,int n){fp(i,1,n-1) b[i-1]=mul(a[i],i); b[n-1]=b[n]=0;
}
inline void Inter(int* a,int* b,int n){fp(i,1,n-1) b[i]=mul(a[i-1],inv[i]); b[0]=0;
}
inline void Ln(int* a,int* b,int n){static arr A,B; Direv(a,A,n),Inv(a,B,n);init(n),NTT(A,1),NTT(B,1);fp(i,0,limit-1) A[i]=mul(A[i],B[i]);NTT(A,0),Inter(A,b,limit);memset(A,0,limit<<2),memset(B,0,limit<<2);
}
inline void Exp(int* a,int* b,int n){static arr F; if(n==1) return b[0]=1,void();Exp(a,b,n>>1),Ln(b,F,n),init(n);F[0]=dec(a[0]+1,F[0]); fp(i,1,n-1) F[i]=dec(a[i],F[i]);NTT(F,1),NTT(b,1); fp(i,0,limit-1) b[i]=mul(b[i],F[i]);NTT(b,0); fp(i,n,limit-1) b[i]=0; memset(F,0,limit<<2);
}
inline void Pow(int* a,int* b,int n,int k){static arr F; memset(F,0,n<<2),Ln(a,F,n);fp(i,0,n-1) F[i]=mul(F[i],k); Exp(F,b,n);
}
int main(){
#ifndef Judgefreopen("polynomial.in","r",stdin);freopen("polynomial.out","w",stdout);
#elsefreopen("1.in","r",stdin);freopen("1.out","w",stdout);
#endifn=read(),k=read(),prep(n<<1);fp(i,0,n-1) a[i]=read(); int len;for(len=1;len<=n;len<<=1);Sqrt(a,b,len),memset(a,0,len<<2);Inv(b,a,len),memset(b,0,len<<2);Inter(a,b,n),memset(a,0,len<<2);Exp(b,a,len),memset(b,0,len<<2);Inv(a,b,len),memset(a,0,len<<2);b[0]=inc(b[0],1);Ln(b,a,len),memset(b,0,len<<2);a[0]=inc(a[0],1);Pow(a,b,len,k),memset(a,0,len<<2);Direv(b,a,n);fp(i,0,n-1) print(a[i]); return Ot(),0;
}

转载于:https://www.cnblogs.com/Judge/p/10735634.html

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



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

相关文章

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

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

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

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

CF Bayan 2015 Contest Warm Up B.(dfs+暴力)

B. Strongly Connected City time limit per test 2 seconds memory limit per test 256 megabytes input standard input output standard output 题目链接: http://codeforces.com/contest/475/probl

CF Bayan 2015 Contest Warm Up A.(模拟+预处理)

A. Bayan Bus time limit per test 2 seconds memory limit per test 256 megabytes input standard input output standard output 题目链接: http://codeforces.com/contest/475/problem/A The fi

2015年校赛总结

题目名为“校赛总结”,其实更想换成“Rainbow为什么五题滚粗?!”。作为今年校赛大二没拆的两个队伍之一,结果打成这样,没脸见人了,总结起来就是我认为自己今天SB了。主要有以下几点: 1.我今天状态的确不好,最后卡的那道B题跟去年在农大校赛上遇见的那题类似,在最后那段时间我已经有思路了,可是由于当时不敢写。等到最后15分钟才开始敲,加上我用很麻烦的Dijstra那种方法,调试起来好多细节要处理

百度之星 2015 复赛 1001 (数长方形)

数长方形    Accepts: 595    Submissions: 1225  Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Problem Description 小度熊喜欢玩木棒。一天他在玩木棒的时候,发现一些木棒会形成长方形

百度之星 2015 初赛(1) 1002 找连续数

找连续数      Accepts: 401      Submissions: 1911  Time Limit: 2000/1000 MS (Java/Others)      Memory Limit: 32768/32768 K (Java/Others) Problem Description 小度熊拿到了一个无序的数组,对于这个数组,小度熊想知道是

2015多校联合训练第三场Work(hdu5326)

题意: a是b的上司,b是c的上司,则a是c的上司,问构成一个树种,有多人是 k个人的上司 思路: 先找出root,然后dfs一下就行 #include <bits/stdc++.h>#define LL long longusing namespace std;const int MAXN = 1e6;int f[105];int n, k;int mp[101][101];

2015年多校联合训练第三场RGCDQ(hdu5317)

题意: f(i)代表i数中有的素数的种数,给出区间[l,r],求区间内max(gcd(f(i))), 由于i最大是1e6,2*3*5*7*11*13*17>1e6,故最多不超过7种素数, 先打表打出1e6内的素数种数表,然后用sum[i][j]代表1-i个数中,还有j个素数的个数,最后用sum[r][j] - sum[l-1][j]求出区间内含有j个素数的数的个数,暴力找出1,2,3,4,5

2015多校联合训练第一场Tricks Device(hdu5294)

题意:给一个无向图,给起点s,终点t,求最少拆掉几条边使得s到不了t,最多拆几条边使得s能到t 思路: 先跑一边最短路,记录最短路中最短的边数,总边数-最短边数就是第二个答案 第一个答案就是在最短路里面求最小割,也就是求最大流,然后根据最短路在建个新图,权为1,跑一边网络流 模板题,以后就用这套模板了 #include <iostream>#include <cstdio>#incl