交了19次没过,求卡常
查看原帖
交了19次没过,求卡常
663291
Finchshine楼主2024/9/27 00:00
#include<bits/stdc++.h>
using namespace std;
const int SIZE=10009;
int a[SIZE],b[SIZE],ans[SIZE];
char sa[SIZE],sb[SIZE];
int sz_a,sz_b,sz_ans;//加速 
void converts(int *a,string s,int &x){
	int i,len=s.size();
	for(i=0;i<len;i++) a[i]=s[len-i-1]-'0';
	x=i-1;
	for(;i<SIZE;i++) a[i]=0; 
}
void print(int *a,int sz){
	int i;
	for(i=sz;i>0;i--)if(a[i]>0) break;
	for(;i>=0;i--)
		cout<<a[i];
	cout<<endl;
}
bool le(int *a,int *b,int &x,int &y){
	int i;
	if(x<y) return true;
	if(y<x) return false;
	for(i=x;i>=0&&a[i]==b[i];i--);
	return i<0||a[i]<b[i];
}
void copy(int *a,int *b,int sz){
	for(int i=0;i<=sz;i++) a[i]=b[i];
}
void mul(int *a,int &x){
	bool flag=false;
	for(int i=0;i<=x;i++){
		a[i]<<=1;
		if(flag) a[i]|=1;
		if(a[i]>=10) a[i]-=10,flag=true;
		else flag=false;
	}
	if(flag) a[++x]=1;
}
void div(int *a,int &x){
	for(int i=x,c=0,now,tmp;i>=0;i--){
		tmp=a[i];
		if(a[i]&1){
			now=((c*10+tmp)>>1)<<1;
			a[i]=(c*10+tmp)>>1;
			c=(c*10+tmp)-now;
		}
		else{
			a[i]=(c*10+tmp)>>1;
			c=0;
		}
	}
	while(a[x]==0) x--;
	if(x==0) x++;
}
void sub(int *a,int *b,int &x,int &y){
	for(int i=0;i<=x;i++){
		if((a[i]-=b[i])<0){
			a[i+1]--;
			a[i]+=10;
		}
	}
	while(a[x]==0) x--;
	if(x<0) x=0;
}
int main() {
	scanf("%s%s",&sa,&sb); 
	converts(a,sa,sz_a);
	converts(b,sb,sz_b);
	ans[0]=1;
	int cnt=0;
	while(1){
		if((!(a[0]&1))&&(!(b[0]&1)))
			div(a,sz_a),div(b,sz_b),cnt++;
		else if((!(a[0]&1))&&(b[0]&1)) div(a,sz_a);
		else if((a[0]&1)&&(!(b[0]&1))) div(b,sz_b);
		else{
			if(le(b,a,sz_b,sz_a)&&le(a,b,sz_a,sz_b))
				break;
			else if(le(b,a,sz_b,sz_a))
				sub(a,b,sz_a,sz_b);
			else
				sub(b,a,sz_b,sz_a);
		}
	}
	if(!le(a,b,sz_a,sz_b)) copy(ans,a,sz_a),sz_ans=sz_a;
	else copy(ans,b,sz_b),sz_ans=sz_b;
	for(int i=1;i<=cnt;i++)
		mul(ans,sz_ans);
	print(ans,sz_ans);
	return 0;
}

有一个点过不了/kk

2024/9/27 00:00
加载中...