第七章埃及数

it2024-11-30  18

#include <iostream> #include <cstdio> #include <cstring> #include <algorithm> using namespace std; typedef long long ll; int maxd; const int maxn=1000000; int best[maxn]; int ans[maxn]; int first(int a,int b) { int it=1; while(1) { if(a*it-b>0) return it; else it++; } } int gcd(ll a,ll b) { return b==0? a:gcd(b,a%b); } bool updatep(int d) { for(int i=d;i>=0;i--) if(ans[i]!=best[i]) return (best[i]==-1 || ans[i]<best[i]); return false; } bool dfs(int d,int from,ll a,ll b) { if(d==maxd) { if(b%a) return false; ans[d]=b/a; if(updatep(d)) memcpy(best,ans,sizeof(ll)*(d+1)); return true; } from=max(from,first(a,b)); bool ok=false; for(int i=from;;i++) { if((maxd+1-d)*b<=a*i) break; ans[d]=i; ll a2=a*i-b; ll b2=b*i; ll g=gcd(a,b); if(dfs(d+1,i+1,a2/g,b2/g)) ok=true; } return ok; } int main() { ll a,b; cin>>a>>b; int ok=0; for(maxd=1;;maxd++) { memset(best,-1,sizeof(best)); if(dfs(0,first(a,b),a,b)) { ok=1; break; } } if(ok) for(int i=0;i<=maxd;i++) printf("%d ",best[i]); else printf("-1"); printf("\n"); return 0; }

 

转载于:https://www.cnblogs.com/tclan126/p/7452224.html

最新回复(0)