如何减小自己的常数?
查看原帖
如何减小自己的常数?
230249
xiaolilsq楼主2020/5/1 17:32

rt,这道题目我用的是NTT,下了数据本地跑3.7s,有没有人有好的建议可以减小常数的?非常感谢!

代码如下:

#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
using namespace std;
inline int read(long long*f){
	char c=getchar();
	for(;!isdigit(c);c=getchar());int len=0;
	for(; isdigit(c);c=getchar())f[len++]=c-'0';
	reverse(f,f+len);return len;
}
const long long mod=998244353;
const int maxn=4000006;
inline long long mo(long long x){
	return x>=mod?x-mod:x;
}
inline long long power(long long a,long long x){
	long long re=1;
	while(x){
		if(x&1)re=re*a%mod;
		a=a*a%mod,x>>=1;
	}
	return re;
}
int rev[maxn],n,m;
inline void NTT(long long*f,long long *p){
	for(int i=0;i<n;++i)
		if(rev[i]<i)
			swap(f[i],f[rev[i]]);
	for(int mid=1;mid<n;mid<<=1){
		const int len=mid<<1,tm=n/len;int tx=0;
		for(int i=0;i<mid;++i){
			for(int j=0;j<n;j+=len){
				int l=i+j,r=l+mid;
				long long L=f[l],R=f[r]*p[tx]%mod;
				f[l]=mo(L+R),f[r]=mo(mod-R+L);
			}
			tx+=tm;
		}
	}
}
long long F[maxn],G[maxn],pp[maxn],ip[maxn];
int main(){
	n=read(F);m=read(G);
	int cn;for(m=n+m-1,n=1,cn=-1;n<m;n<<=1,++cn);
	for(int i=1;i<n;++i)rev[i]=(rev[i>>1]>>1)|((i&1)<<cn);
	pp[0]=ip[0]=1;pp[1]=power(3ll,(mod-1)/n);ip[1]=power(3ll,mod-1-(mod-1)/n);
	for(int i=2;i<=n;++i)pp[i]=pp[i-1]*pp[1]%mod,ip[i]=ip[i-1]*ip[1]%mod;
	NTT(F,pp);NTT(G,pp);
	for(int i=0;i<n;++i)F[i]=F[i]*G[i]%mod;
	NTT(F,ip);const long long Base=power(n,mod-2);
	for(int i=0;i<n;++i)F[i]=F[i]*Base%mod;
	for(int i=0;i<m;++i){
		long long tmp=F[i]/10;
		F[i+1]+=tmp,F[i]-=tmp*10;
	}
	while(F[m]){
		long long tmp=F[m]/10;
		F[m+1]+=tmp,F[m]-=tmp*10;
		++m;
	}
	while(m--)
		putchar(F[m]+'0');
	putchar('\n');
	return 0;
}

非常感谢!

2020/5/1 17:32
加载中...