hack没过玄关
查看原帖
hack没过玄关
734491
Objective楼主2025/6/15 12:10

使用 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;
}
2025/6/15 12:10
加载中...