使用 C O2,
#include <stdio.h>
#include <stdbool.h>
#include <string.h>
#define ll long long
// 自带的sqrt太慢了,就干脆用到的函数都手写了
double abs(double a){
return (a > 0) ? a : -a;
}
ll gcd(ll a, ll b){
return (b == 0) ? a : gcd(b, a % b);
}
ll max(ll a, ll b){
return (a > b) ? a : b;
}
ll min(ll a, ll b){
return (a < b) ? a : b;
}
double sqrt(double n){
double x0 = n;
while (abs(x0 * x0 - n) >= 1e-6) {
x0 = 0.5 * (n / x0 + x0);
}
return x0;
}
ll deep, s[11], ans[11], flag, a, b;
void dfs(ll a, ll b, int x){
if (x > deep) return;
if (a == 1 && b > s[x - 1]){
s[x] = b;
if (!flag || s[x] < ans[x])
memcpy(ans, s, sizeof(ll) * (deep + 1));
flag = 1;
return;
}
ll l = max(b / a + 1, s[x - 1] + 1);
ll r = (deep - x + 1) * b / a;
if (flag && r >= ans[deep]) r = ans[deep] - 1;
for (ll i = l; i < r; i++) {
s[x] = i;
ll gcdd = gcd(a * i - b, b * i);
dfs((a * i - b) / gcdd, b * i / gcdd, x + 1);
}
}
int main() {
scanf("%lld%lld", &a, &b);
ll g = gcd(a, b);
a /= g, b /= g;
for (deep = 1; deep <= 10; deep++) {
dfs(a, b, 1);
if (flag) {
for (int i = 1; i <= deep; i++) {
printf("%lld ", ans[i]);
}
return 0;
}
}
return 0;
}