// by BNU_LZM
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
int ans[1010], v[1010], maxd;
int gcd(int a, int b)
{
return b == 0 ? a : gcd(b, a%b);
}
int get_from(int a, int b)
{
int i;
for(i = 2; ; i++)
{
if(b <= a*i) break;
}
return i;
}
bool better(int d)
{
for(int i = d; i > 0; i--)
{
if(v[i] != ans[i])
{
return ans[i] == -1 || v[i] < ans[i];
}
}
return false;
}
int dfs(int cur, int from, int a, int b)
{
if(cur+1 == maxd)
{
if(b%a == 0)
{
b /= a;
if(v[cur] == b) return 0;
v[maxd] = b;
if(better(maxd)) memcpy(ans, v, sizeof(v));
return 1;
}
else return 0;
}
int ok = 0;
from = max(from, get_from(a, b));
for(int i = from; ; i++)
{
if(b*(maxd-cur) < a*i) break;
v[cur+1] = i;
int bb = b*i;
int aa = a*i-b;
int g = gcd(aa, bb);
//printf("%d\n", cur);
if(dfs(cur+1, i+1, aa/g, bb/g)) ok = 1;
}
return ok;
}
int main()
{
//freopen("in.txt", "r", stdin);
int a, b;
cin >> a >> b;
printf("%d/%d=", a, b);
int ok = 0;
for(maxd = 1; ; maxd++)
{
memset(ans, -1, sizeof(ans));
if(dfs(0, get_from(a, b), a, b))
{
ok = 1;
break;
}
}
if(ok)
{
for(int i = 1; i <= maxd; i++)
{
if(i == 1)
printf("1/%d", ans[i]);
else printf("+1/%d", ans[i]);
}
}
return 0;
}
埃及分数问题
最新推荐文章于 2023-06-06 23:33:30 发布