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;
}
非常感谢!