这什么情况。
查看原帖
这什么情况。
203623
critnos楼主2021/11/26 17:52

我本机极限数据不到 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;
}
2021/11/26 17:52
加载中...