60分dalao求调
查看原帖
60分dalao求调
701478
_FastFT2013楼主2023/10/17 12:21
#include<iostream>
#include<memory.h>
using namespace std;
string add(string x,string y){
	int lena=x.size();
	int lenb=y.size();
	int lenc=max(lena,lenb);
	short a[lena+2]={0},b[lena+2]={0},c[lenc+2]={0};
	int k=1;
	for(int i=lena-1;i>=0;i--)a[k++]=x[i]-'0';
	k=1;
	for(int i=lenb-1;i>=0;i--)b[k++]=y[i]-'0';
	for(int i=1;i<=lenc;i++){
		c[i]+=a[i]+b[i];
		c[i+1]+=c[i]/10;
		c[i]%=10;
	}
	if(c[lenc+1])lenc++;
	string z="";
	for(int i=lenc;i>=1;i--)z=z+char(c[i]+'0');
	return z;
}
string chen(string x,string y){
	int lena=x.size();
	int lenb=y.size();
	int lenc=lena+lenb;
	short a[lena+2]={0},b[lenb+2]={0},c[lenc+2]={0};
	int k=1;
	for(int i=lena-1;i>=0;i--)a[k++]=x[i]-'0';
	k=1;
	for(int i=lenb-1;i>=0;i--)b[k++]=y[i]-'0';
	for(int i=1;i<=lena;i++){
		for(int j=1;j<=lenb;j++){
			c[i+j-1]+=a[i]*b[j];
		}
	}
	for(int i=1;i<=lenc;i++){
		c[i+1]+=c[i]/10;
		c[i]%=10;
	}
	while(!c[lenc])lenc--;
	string z="";
	for(int i=max(1,lenc);i>=1;i--)z=z+char(c[i]+'0');
	return z;
}
string jian(string x,string y){
	int lena=x.size();
	int lenb=y.size();
	int lenc=max(lena,lenb);
	short a[lena+2]={0},b[lenb+2]={0},c[lenc+2]={0};
	int k=1;
	for(int i=lena-1;i>=0;i--)a[k++]=x[i]-'0';
	k=1;
	for(int i=lenb-1;i>=0;i--)b[k++]=y[i]-'0';
	for(int i=1;i<=lenc;i++){
		c[i]+=a[i]-b[i];
		if(c[i]<0){
			c[i+1]--;
			c[i]=10+c[i];
		}
	}
	while(!c[lenc])lenc--;
	string z="";
	for(int i=lenc;i>=1;i--)z=z+char(c[i]+'0');
	return z;
}
int szleftbig(int a[],int b[],int lena,int lenb){
	if(lena>lenb){
		return 1;
	}else if(lenb>lena){
		return 0;
	}
	for(int i=lena;i>=1;i--){
		if(a[i]>b[i]){
			return 1;
		}else if(a[i]<b[i]){
			return 0;
		}
	}
	return -1;
}
bool leftb(string a,string b){
	if(a.size()>b.size())return true;
	else if(a.size()<b.size()) return false;
	for(int i=0;i<int(a.size());i++){
		if(a[i]>b[i]){
			return true;
		}else if(a[i]<b[i]){
			return false;
		}
	}
	return false;
}
bool leftbig(string a,string b){
	if(a.size()>b.size())return true;
	else if(a.size()<b.size()) return false;
	for(int i=0;i<int(a.size());i++){
		if(a[i]>b[i]){
			return true;
		}else if(a[i]<b[i]){
			return false;
		}
	}
	return true;
}
void numcpy(int p[],int q[],int tank,int lenq){
	for(int i=1;i<=lenq;i++)q[tank+i-1]=p[i];
}
string szstl(int a[],int lena){
	while(!a[lena])lena--;
	string x="";
	for(int i=max(lena,1);i>=1;i--)x=x+char(a[i]+'0');
	return x;
}
string chugcg(string x,string y){
	int lena=x.size();
	int lenb=y.size();
	int lenc=lena-lenb+1;
	int a[lena+2]={0},b[lenb+2]={0},c[lenc+2]={0};
	int tmp[lenb+lenc+1]={0};
	int k=1;
	for(int i=lena-1;i>=0;i--)a[k++]=x[i]-'0';
	k=1;
	for(int i=lenb-1;i>=0;i--)b[k++]=y[i]-'0';
	for(int i=lenc;i>=1;i--){
		memset(tmp,0,sizeof tmp);
		numcpy(b,tmp,i,lenb);
		while(szleftbig(a,tmp,lena,lenb+i-1)){
			c[i]++;
			if(szleftbig(a,tmp,lena,lenb+i-1)==-1){
				goto kkksc03;
			}
			for(int j=1;j<=lena;j++){
				a[j]=a[j]-tmp[j];
				if(a[j]<0){
					a[j]+=10;
					a[j+1]--;
				}
			}
			while(!a[lena])lena--;
		}
	}
	kkksc03:;
	return szstl(c,lenc);
}
string chugcd(string x,int y){
	int lena=x.size();
	int lencr=lena;
	int t=0;
	short a[lena+2]={0};
	short c[lencr+2]={0};
	for(int i=lena-1;i>=0;i--)a[i+1]=x[i]-'0';
	for(int i=1;i<=lena;i++){
		t=t*10+a[i];
		c[i]=t/y;
		t%=y;
	}
	int lencl=1;
	while(!c[lencl])lencl++;
	string z="";
	if(lencl>lencr){
		z="0";
	}else{
		for(int i=lencl;i<=lencr;i++)z=z+char(c[i]+'0');
	}
	return z;
}
string ksm(string a,int b){
	string sum="1";
	while(b){
		if(b&1){
			sum=chen(sum,a);
		}
		a=chen(a,a);
		b>>=1;
	}
	return sum;
}
int main(){
	int m;
	string n;
	cin>>m>>n;
	string l="0",r="1";
	while(leftb(n,ksm(r,m))){
		l=r;
		r=chen(r,"2");
	}
	while(leftb(r,add(l,"1"))){
		string mid=chugcd(add(r,l),2);
//		cout<<l<<" "<<r<<" "<<mid<<"\n";
		if(leftb(ksm(mid,m),n))r=mid;
		else l=mid;
	}
	if(leftbig(n,ksm(r,m))){
		cout<<r;
	}else{
		cout<<l;
	}
	return 0;
}
2023/10/17 12:21
加载中...