0pts求调
  • 板块P1763 埃及分数
  • 楼主Neokaye
  • 当前回复0
  • 已保存回复0
  • 发布时间2024/11/27 13:12
  • 上次更新2024/11/27 16:34:52
查看原帖
0pts求调
1232851
Neokaye楼主2024/11/27 13:12

代码:

#include<bits/stdc++.h>
using namespace std;
#define ll long long

ll depth=1,st[10001],ans[10001],flag,a,b,max_a;
ll gcd(ll x,ll y){
	return y==0?x:gcd(y,x%y);
}
void dfs(ll a,ll b,ll dep){
	if(dep>depth){
		return ;
	}
	if(a==1&&b>st[dep-1]){
		st[dep]=b;
		if(!flag||st[dep]<ans[dep]){
			for(ll i=1;i<=dep;i++) ans[i]=st[i];
		}
		flag=1;
		return ;
	}
	if(dep==depth-1){
		int l=((b<<2)/(a*a))+1,r=min(((max_a<<1))/a,max_a*max_a/b);
		for(int i=l;i<=r;i++){
			int delta=a*a*i*i-((b*i)<<2);
			int Sqrt=sqrt(delta);
			if(Sqrt*Sqrt!=delta||((a*i-Sqrt)&1))
				continue;
			st[dep]=(a*i-Sqrt)>>1;st[dep+1]=(a*i+Sqrt)>>1;
			if(st[dep]<=st[dep-1]||st[dep+1]<=st[dep])
				continue;
			if(!flag||st[depth]<ans[depth]){
				for(int j=1;j<=depth;j++)
					ans[j]=st[j];
				flag=true;
			}
		}
		return;
	}
	ll l=max(b/a,st[dep-1]+1);
	ll r=(depth-dep+1)*b/a;
	if(flag&&r>=ans[depth]){
		r=ans[depth]-1;
	}
	for(ll i=l;i<=r;i++){
		st[dep]=i;
		ll gcdx=gcd(a*i-b,b*i);
		dfs((a*i-b)/gcdx,b*i/gcdx,dep+1);
	}
}
void IDDFS(){
	for(depth=1;depth<=10;depth++){
		for(ll max_a=1e5;max_a<=1e7;max_a*=10){
			dfs(a,b,1);
			if(flag) {
				for(int i=1;i<=depth;i++){
				cout<<ans[i]<<' ';
				}
				exit(0);
			}
		}
		
	}
}
int main(){
	ios::sync_with_stdio(false);
	cin.tie(0);
	cin>>a>>b;
	ll c=gcd(a,b);
	a/=c;b/=c;st[0]=1;
	IDDFS();
	return 0;
}

又tle又wa

2024/11/27 13:12
加载中...