90分求救!
查看原帖
90分求救!
532102
FyFiveFF 姐姐楼主2022/9/7 16:21

90分求救!

我的90分记录

代码:

#include<bits/stdc++.h>
#define ll long long
#define V inline void
#define mes 100000000
using namespace std;
int m;
string inn;
ll n[3000];int wn;
ll l[3000];int wl;
ll mid[3000];int wm;
ll mmid[3000];int wd;
ll r[3000];int wr;
ll ls[3000];int wls;
ll ksm[3000];int wk;
int csl,csr;

V copy()
{
	for(int i=1;i<=wm;i++) mmid[i]=mid[i];
	for(int i=wm+1;i<=wd;i++) mmid[i]=0;
	wd=wm;
}
V csh()
{
	wl=1;wr=1;
	if(csl>=0) l[1]=1;
	r[1]=1;
	for(int i=1;i<=csl;i++)
	{
		l[wl]*=10;
		if(i%8==0)
		{
			l[wl]=0;
			l[++wl]++;
		}
	}
	for(int i=1;i<=csr;i++)
	{
		r[wr]*=10;
		if(i%8==0)
		{
			r[wr]=0;
			r[++wr]++;
		}
	}
}
V gmid()
{
	for(int i=1;i<=wm;i++) mid[i]=0;
	for(int i=1;i<=wls;i++) ls[i]=0;
	for(int i=1;i<=wr;i++) ls[i]=l[i]+r[i];
	for(int i=1;i<=wr;i++)
	{
		ls[i+1]+=ls[i]/mes;
		ls[i]%=mes;
	}
	wm=wr;wls=wr;
	if(ls[wm+1]>0) wm++;
	for(int i=wm;i>=1;i--)
	{
		mid[i]=ls[i]/2;
		ls[i-1]+=ls[i]%2*mes;
	}
	if(mid[wm]==0) wm--;
}
inline bool cmpmn()
{
	if(wm!=wn) return wm<wn;
	else
	{
		for(int i=wm;i>=1;i--)
		{
			if(mid[i]!=n[i]) return mid[i]<n[i];
		}
		return true;
	}
}
V chmk()
{
	for(int j=1;j<=wls;j++)
	{
		ls[j]=0;
	}
	for(int i=1;i<=wk;i++)
	{
		for(int j=1;j<=wm;j++)
		{
			ls[i+j-1]+=ksm[i]*mid[j];
		}
		for(int j=i;j<=i+wm;j++)
		{
			ls[j+1]+=ls[j]/mes;
			ls[j]%=mes;
		}
	}
	wm+=wk;
	while(ls[wm]==0)
	{
		wm--;
	}
	wls=wm;
	for(int i=1;i<=wm;i++) mid[i]=ls[i];
}
V chkk()
{
	for(int j=1;j<=wls;j++)
	{
		ls[j]=0;
	}
	for(int i=1;i<=wk;i++)
	{
		for(int j=1;j<=wk;j++)
		{
			ls[i+j-1]+=ksm[i]*ksm[j];
		}
		for(int j=i;j<=i+wk;j++)
		{
			ls[j+1]+=ls[j]/mes;
			ls[j]%=mes;
		}
	}
	wk+=wk;
	while(ls[wk]==0&&wk>1)
	{
		wk--;
	}
	wls=wk;
	for(int i=1;i<=wk;i++) ksm[i]=ls[i];
}
V fst()
{
	ll i=1;
	copy();
	for(int j=1;j<=wm;j++)
	{
		ksm[j]=mid[j];
		mid[j]=0;
	}
	wk=wm;
	for(int j=wm+1;j<=wk;j++)
	{
		ksm[j]=0;
	}
	mid[1]=1;wm=1;
	while(i<=m)
	{
		if(i&m)
		{
			chmk();
		}
		chkk();
		i*=2;
	}
}
inline bool cmplr()
{
	for(int i=wr;i>1;i--)
	{
		if(l[i]!=r[i]) return false;
	}
	if(r[1]-l[1]<=1) return true;
	else return false;
}
V cglm()
{
	for(int i=1;i<=wd;i++) l[i]=mmid[i];
	wl=wd;
}
V cgrm()
{
	for(int i=1;i<=wr;i++) r[i]=mmid[i];
	wr=wd;
}

int main()
{
	cin>>m>>inn;
	wn=0;
	ll sm=1;
	for(int i=0;i<inn.size();i++)
	{
		if(i%8==0)
		{
			wn++;
			sm=1;
		}
		else sm*=10;
		n[wn]+=(ll)(inn[inn.size()-1-i]-'0')*sm;
	}
	csr=inn.size()/m+1;
	csl=inn.size()/m-1;
	csh();
	while(!cmplr())
	{
		gmid();
		fst();
		if(cmpmn()) cglm();
		else cgrm();
	}
	ll wz=8*wl-8;
	cout<<l[wl];
	while(l[wl]>0)
	{
		wz++;
		l[wl]/=10;
	}
	if(wz==239) l[1]++;
	for(int i=wl-1;i>=1;i--) printf("%08lld",l[i]);
	return 0;
}

第八个点总是莫名其妙地少了1,改大初始右端点值还是少1

求救qwq!

2022/9/7 16:21
加载中...