求助,本地 ac 实测 tle
查看原帖
求助,本地 ac 实测 tle
344016
wurzang楼主2020/8/8 13:05

在本地跑了一下 n=109,k=3.2×104n=10^9,k=3.2 \times 10^4 时的随机数据,结果我的 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;
}
2020/8/8 13:05
加载中...