在本地跑了一下 n=109,k=3.2×104 时的随机数据,结果我的 tle 代码是 2.31s,神蛙的 ac 代码是 7.39s....
感觉是因为评测机原因于是把神蛙的代码交了一下,结果过了
实在不知道怎么回事就来问一下,代码如下:
#pragma GCC diagnostic error "-std=c++11"
#pragma GCC target("avx")
#pragma GCC optimize(1)
#pragma GCC optimize(2)
#pragma GCC optimize(3)
#pragma GCC optimize("Ofast")
#pragma GCC optimize("inline")
#pragma GCC optimize("-fgcse")
#pragma GCC optimize("-fgcse-lm")
#pragma GCC optimize("-fipa-sra")
#pragma GCC optimize("-ftree-pre")
#pragma GCC optimize("-ftree-vrp")
#pragma GCC optimize("-fpeephole2")
#pragma GCC optimize("-ffast-math")
#pragma GCC optimize("-fsched-spec")
#pragma GCC optimize("unroll-loops")
#pragma GCC optimize("-falign-jumps")
#pragma GCC optimize("-falign-loops")
#pragma GCC optimize("-falign-labels")
#pragma GCC optimize("-fdevirtualize")
#pragma GCC optimize("-fcaller-saves")
#pragma GCC optimize("-fcrossjumping")
#pragma GCC optimize("-fthread-jumps")
#pragma GCC optimize("-funroll-loops")
#pragma GCC optimize("-fwhole-program")
#pragma GCC optimize("-freorder-blocks")
#pragma GCC optimize("-fschedule-insns")
#pragma GCC optimize("inline-functions")
#pragma GCC optimize("-ftree-tail-merge")
#pragma GCC optimize("-fschedule-insns2")
#pragma GCC optimize("-fstrict-aliasing")
#pragma GCC optimize("-fstrict-overflow")
#pragma GCC optimize("-falign-functions")
#pragma GCC optimize("-fcse-skip-blocks")
#pragma GCC optimize("-fcse-follow-jumps")
#pragma GCC optimize("-fsched-interblock")
#pragma GCC optimize("-fpartial-inlining")
#pragma GCC optimize("no-stack-protector")
#pragma GCC optimize("-freorder-functions")
#pragma GCC optimize("-findirect-inlining")
#pragma GCC optimize("-fhoist-adjacent-loads")
#pragma GCC optimize("-frerun-cse-after-loop")
#pragma GCC optimize("inline-small-functions")
#pragma GCC optimize("-finline-small-functions")
#pragma GCC optimize("-ftree-switch-conversion")
#pragma GCC optimize("-foptimize-sibling-calls")
#pragma GCC optimize("-fexpensive-optimizations")
#pragma GCC optimize("-funsafe-loop-optimizations")
#pragma GCC optimize("inline-functions-called-once")
#pragma GCC optimize("-fdelete-null-pointer-checks")
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll mod=998244353;
const int G=3,invG=332748118,N=1200000;
ll ksm(ll b,int n){
ll res=1;
while(n){
if(n&1) res=res*b%mod;
b=b*b%mod; n>>=1;
}
return res;
}
int tr[N],GG[2][N];
inline void init_GG(){
for(int p=2;p<N;p<<=1){
GG[0][p]=ksm(G,(mod-1)/p);
GG[1][p]=ksm(invG,(mod-1)/p);
}
}
inline void NTT(int *f,int n,int fl){
for(register int i=0;i<n;++i)
if(i<tr[i]) swap(f[i],f[tr[i]]);
for(int p=2;p<=n;p<<=1){
int len=(p>>1);
ll w=(fl==0)?GG[0][p]:GG[1][p];
for(register int st=0;st<n;st+=p){
ll buf=1,tmp;
for(int i=st;i<st+len;++i)
tmp=1ll*buf*f[i+len]%mod,
f[i+len]=(f[i]-tmp+mod)%mod,
f[i]=(f[i]+tmp)%mod,
buf=buf*w%mod;
}
}
if(fl==1){
ll invN=ksm(n,mod-2);
for(register int i=0;i<n;++i)
f[i]=(1ll*f[i]*invN)%mod;
}
}
inline void Mul(int *f,int *g,int n,int m){
static int _f[N];
for(register int i=0;i<n;++i)
_f[i]=f[i];
for(register int i=n;i<(n<<2);++i)
_f[i]=0;
m+=n;n=1;
while(n<m) n<<=1;
for(register int i=0;i<n;++i)
tr[i]=(tr[i>>1]>>1)|((i&1)?(n>>1):0);
NTT(_f,n,0);
NTT(g,n,0);
for(register int i=0;i<n;++i) g[i]=1ll*_f[i]*g[i]%mod;
NTT(g,n,1);
}
inline void Inv(int *f,int *g,int m){
if(m==1){
g[0]=ksm(f[0],mod-2);
return;
}
Inv(f,g,(m+1)>>1);
int n=1;
while(n<(m<<1)) n<<=1;
static int w[N];
for(register int i=0;i<m;++i) w[i]=f[i];
for(register int i=m;i<n;++i) w[i]=0;
for(register int i=0;i<n;++i)
tr[i]=(tr[i>>1]>>1)|((i&1)?(n>>1):0);
NTT(w,n,0);
NTT(g,n,0);
for(register int i=0;i<n;++i)
g[i]=((2ll*g[i]-1ll*g[i]*g[i]%mod*w[i]%mod)%mod+mod)%mod;
NTT(g,n,1);
for(register int i=m;i<n;++i) g[i]=0;
}
inline void Mod(int *f,int *g,int *r,int n,int m){
static int wf[N],wg[N],dev[N],_g[N],_f[N];
for(register int i=0;i<(n<<2);++i)
wf[i]=wg[i]=dev[i]=_g[i]=_f[i]=0;
for(register int i=0;i<n;++i) wf[i]=_f[i]=f[i];
for(register int i=0;i<m;++i) wg[i]=_g[i]=g[i];
reverse(wf,wf+n);reverse(wg,wg+m);
Inv(wg,dev,n-m+1);
Mul(wf,dev,n,n-m+1);
reverse(dev,dev+n-m+1);
for(register int i=n-m+1;i<(n<<2);++i)
dev[i]=0;
Mul(_g,dev,m,n-m+1);
for(register int i=0;i<m-1;++i)
r[i]=(_f[i]-dev[i]+mod)%mod;
for(register int i=m-1;i<n;++i)
r[i]=0;
}
inline void qpow(int *dev,int *r,int b,int n){
r[0]=1;
static int f[N];
//memset(f,0,sizeof(f));
f[1]=1;
while(b){
if(b&1) Mul(f,r,n,n),Mod(r,dev,r,n<<1,n);
Mul(f,f,n,n),Mod(f,dev,f,n<<1,n);
b>>=1;
}
}
int f[N],g[N];
inline int rd(){
int x=0,f=1;char ch=getchar();
while(!isdigit(ch)){
if(ch=='-')f=-1;
ch=getchar();
}
while(isdigit(ch)) x=x*10+ch-'0',ch=getchar();
return x*f;
}
int main(){
// freopen("test.in","r",stdin);
// freopen("test.out","w",stdout);
init_GG();
int n,k,x;
n=rd();k=rd();
for(register int i=1;i<=k;++i){
x=rd();
x=(x%mod+mod)%mod;
f[k-i]=mod-x;
}
f[k]=1;ll ans=0;
qpow(f,g,n,k+1);
for(register int i=0;i<k;++i){
x=rd();
x=(x%mod+mod)%mod;
ans+=1ll*x*g[i]%mod;ans%=mod;
}
cout<<ans;
return 0;
}