#include<bits/stdc++.h> #define int long long using namespace std; int a,b; int deep; int ans[102];//预测深度不超过100 int ansz[102];//最优解 int f(int a,int b) { for(int i=1;; ++i) { if(a*i>b) return i; } } bool dfs(int d,int a,int b) { if(d==deep)//达到目标深度 { //判断这个解是否有效 if(b%a!=0)//无效 return false; ans[d]=b/a;//把最后个分母存进去 //找到最优解 if(ans[d]<ansz[d]||ansz[d]==0) for(int i=0; i<=deep; ++i) ansz[i]=ans[i];//把所有的都替换为最优解 return true; }
//没到目标深度
//找到第一个使得1/i小于a/b的i
int i=f(a,b);
if(d>0)
i=max(i,ans[d-1]+1);//确保每个单位分数都互不相同的
int ok=0;//标记有无找到解
for(;; ++i)
{
//1/i是当前最大的,那么根据层的目标,如果
//a/b>(deep-d+1)*1/i 都不满足条件,则剪枝
if((deep-d+1)*b<=i*a) break;
ans[d]=i;//
//a/b-1/i=aa/bb a*i=aa b*i=bb>=aa=a*/-b
int aa=a*i-b;//计算剩余的分子
int bb=b*i;//剩余的分母
int g=__gcd(aa,bb);
if(dfs(d+1,aa/g,bb/g))
ok=1;
}
return ok==1;
} signed main() { ios::sync_with_stdio(0); cin.tie(0); cout.tie(0); cin>>a>>b; while(1) { deep++; if(dfs(0,a,b))//找到答案了 { for(int i=0; i<=deep; ++i) cout<<ansz[i]<<' '; return 0; } } return 0; }
#include<bits/stdc++.h>
#define int long long
using namespace std;
int a,b;
int deep;
int ans[102];//预测深度不超过100
int ansz[102];//最优解
int f(int a,int b)
{
for(int i=1;; ++i)
{
if(a*i>b) return i;
}
}
bool dfs(int d,int a,int b)
{
if(d==deep)//达到目标深度
{
//判断这个解是否有效
if(b%a!=0)//无效
return false;
ans[d]=b/a;//把最后个分母存进去
//找到最优解
if(ans[d]<ansz[d]||ansz[d]==0)
for(int i=0; i<=deep; ++i)
ansz[i]=ans[i];//把所有的都替换为最优解
return true;
}
//没到目标深度
//找到第一个使得1/i小于a/b的i
int i=f(a,b);
if(d>0)
i=max(i,ans[d-1]+1);//确保每个单位分数都互不相同的
int ok=0;//标记有无找到解
for(;; ++i)
{
//1/i是当前最大的,那么根据层的目标,如果
//a/b>(deep-d+1)*1/i 都不满足条件,则剪枝
if((deep-d+1)*b<=i*a) break;
ans[d]=i;//
//a/b-1/i=aa/bb a*i=aa b*i=bb>=aa=a*/-b
int aa=a*i-b;//计算剩余的分子
int bb=b*i;//剩余的分母
int g=__gcd(aa,bb);
if(dfs(d+1,aa/g,bb/g))
ok=1;
}
return ok==1;
}
signed main()
{
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
cin>>a>>b;
while(1)
{
deep++;
if(dfs(0,a,b))//找到答案了
{
for(int i=0; i<=deep; ++i)
cout<<ansz[i]<<' ';
return 0;
}
}
return 0;
}