代码:
#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