AcWing 1120. 埃及分数
原题链接
中等
作者:
往前看
,
2025-04-14 22:41:54
· 河南
,
所有人可见
,
阅读 6
根据b站视频所写
hack数据优化
迭代思路
#include<iostream>
#include<algorithm>
#include<cmath>
using namespace std;
#define ll long long
ll deep = 1, st[11], ans[11], flag;
ll gcd(ll x, ll y) {
if (y == 0)return x;
else return gcd(y, x % y);
}
void dfs(ll dep, ll a, ll b) {
if (dep == deep - 1) {
ll mini = ceil(4 * b / (a * a));
for (ll k = mini;; k++) {
ll delta = a * a * k * k - 4 * b * k;
ll r = -1;
ll t = sqrt(delta);
if ((t - 1) * (t - 1) == delta)r = t - 1;
else if (t * t == delta)r = t;
else if ((t + 1) * (t + 1) == delta)r = t + 1;
ll x = (a * k - r) / 2;
ll y = (a * k + r) / 2;
if (y > 1e7)break;
if (flag && ans[deep] <= y)break;
if (r <= 0)continue;
if ((a * k - r) % 2 != 0)continue;
st[deep-1] = x;
st[deep] = y;
for (int i = 1; i <= deep; i++) {
ans[i] = st[i];
}
flag = 1;
break;
}
return;
}
ll l = max(b / a+1, st[dep - 1] + 1);
ll r=1e7;
if (flag)
r = ans[deep] - 1;
r = min(r,(deep - dep + 1) * b / a);
for (ll i = l; i <= r; i++) {
st[dep] = i;
ll gc = gcd(a * i - b, b * i);
dfs(dep + 1, (a * i - b) / gc, b * i / gc);
}
}
signed main(void) {
ios::sync_with_stdio(false);
ll a, b;
cin >> a >> b;
ll c = gcd(a, b);
a /= c;
b /= c;
st[0] = 1;
for (deep = 1; deep <= 10; deep++) {
dfs(1, a, b);
if (flag) {
for (int i = 1; i <= deep; i++) {
printf("%lld ", ans[i]);
}
break;
}
}
return 0;
}