ID 迭代加深搜尋 模板 埃及分數
阿新 • • 發佈:2018-12-19
#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; } } }