我本机极限数据不到 1s,交上去 TLE???
#include<bits/stdc++.h>
#define ull unsigned long long
using namespace std;
const int G=3,mod=998244353;
ull qpow(ull a,int p)
{
ull mul=1;
for(;p;p>>=1)
{
if(p&1) mul=mul*a%mod;
a=a*a%mod;
}
return mul;
}
const int inv=qpow(G,mod-2);
int ntt(int a[],bool fl,int l)
{
static ull f[5000000],w[5000000];
static int bt[5000000];
int i,j,p,t,n;
ull po;
for(n=1;n<l;n*=2);
for(i=0;i<n;i++)
bt[i]=bt[i/2]/2|((i&1)?n/2:0);
for(i=0;i<n;i++)
f[i]=a[bt[i]];
w[0]=1;
for(l=1;l<n;l*=2)
{
po=qpow(fl?inv:G,(mod-1)/(l*2));
for(i=1;i<l;i++)
w[i]=w[i-1]*po%mod;
for(i=0;i<n;i+=l*2)
for(j=0;j<l;j++)
t=w[j]*f[i|l|j]%mod,
f[i|l|j]=f[i|j]+mod-t,
f[i|j]+=t;
if(l==(1<<17))
for(i=0;i<n;i++)
f[i]%=mod;
}
if(fl)
{
po=qpow(n,mod-2);
for(i=0;i<n;i++)
a[i]=f[i]%mod*po%mod;
}
else
for(i=0;i<n;i++)
a[i]=f[i]%mod;
return n;
}
int read()
{
int s=0,w=1;
char ch=getchar();
while(ch<'0'||ch>'9') w=ch=='-'?-1:w,ch=getchar();
while(ch>='0'&&ch<='9') s=s*10+ch-'0',ch=getchar();
return s*w;
}
char sp[2000005];
int s[2000005];
const int base=1e3;
void mul(int a[],int c[],int &n,int m)
{
static int b[5000000];
memcpy(b,c,m+1<<2);
int len=ntt(a,0,n+m),i;
ntt(b,0,n+m);
for(i=0;i<len;i++)
a[i]=1ll*a[i]*b[i]%mod;
ntt(a,1,n+m);
for(i=0;i<=len;i++)
a[i+1]+=a[i]/base,a[i]%=base;
memset(b,0,len<<2);
for(n=len;~n&&!a[n];n--);
n++;
}
int a[5000000],res[5000000];
int n,u,m,tp;
void init()
{
int n=1,m=1,p=u,i;
a[0]=3,res[0]=1;
for(;p;p>>=1)
{
if(p&1)
mul(res,a,m,n);
mul(a,a,n,n);
}
// cout<<u<<endl;
// for(i=m-1;i>=0;i--)
// cout<<res[i];
// cout<<endl;
tp=m;
}
void addmul(int x)
{
int i;
for(i=0;i<m;i++)
a[i]*=x;
for(i=0;i<m;i++)
a[i+1]+=a[i]/base,a[i]%=base;
if(a[m]) m++;
}
bool check(int x)
{
int t=x/3-(x%3==1),i;
m=tp;
memcpy(a,res,tp+1<<2);
for(i=u;i<t;i++) addmul(3);
if(x%3==2) addmul(2);
if(x%3==1) addmul(4);
if(m!=n) return m>n;
for(i=m-1;i>=0;i--)
if(s[i]!=a[i])
return a[i]>s[i];
return 1;
}
int main()
{
int i,len,pren;
// scanf("%s",sp);
// pren=n=strlen(sp);
pren=n=1.5*1e6;
for(i=0;i<n;i++) sp[i]='1';
u=(log(10)/log(3))*(n-1)-1;
init();
cout<<clock()<<endl;
for(i=0;i<n;i++)
s[i]=sp[i]-'0';
reverse(s,s+n);
for(n=i=0;i<pren;i+=3)
s[n]=s[i]+s[i+1]*10+s[i+2]*100,n++;
for(i=(log(10)/log(3))*(pren-1)*3;!check(i);memset(a,0,m+1<<2),i++);
cout<<i;
}