1. 程式人生 > >ID 迭代加深搜尋 模板 埃及分數

ID 迭代加深搜尋 模板 埃及分數

#include <bits/stdc++.h>
using namespace std;


int Maxd, Ans[10], now[10];
bool flag;

inline int gcd(int a, int b) { return b ? gcd(b, a%b) : a; }

inline void id_dfs(int a, int b, int k) //a / b
{
    if(k > Maxd) return;
    if(b%a == 0 && b/a > now[k-1]) //不能有相同分母
    {
        now[k] = b/a;
        if(!flag || now[k] < Ans[k])
            memcpy(Ans, now, sizeof now);
        flag = 1;
        return;
    }
    int mn = max(b/a, now[k-1] + 1);
    int mx = b * (Maxd-k+1) / a;
    if(flag) mx = min(mx, Ans[Maxd] - 1);
    for(int i = mn; i <= mx; i++)
    {
        if (b*(Maxd + 1 - k) <= i*a)break;
        int Gcd = gcd(a*i-b, b*i);
        now[k] = i;
        id_dfs((a*i-b)/Gcd, b*i/Gcd, k+1);
    }
}

int main()
{
    int a, b;
    scanf("%d%d", &a, &b);
    for(Maxd = 1; ; Maxd++)
    {
        id_dfs(a, b, 1);
        if(flag)
        {
            for(int i = 1; i <= Maxd; i++)
                printf("%d%c", Ans[i], i == Maxd ? 10 : 32);
            return 0;
        }
    }
}