1. 程式人生 > >埃及分數(叠代深搜)

埃及分數(叠代深搜)

urn 理解 決定 步驟 its void oid %d class

#include<bits/stdc++.h>
using namespace std;
long long ch,mo;
int dep;
long long ans[1000],s[1000];
int gcd(long long a,long long b)
{
    return b==0?a:gcd(b,a%b);
}
void outp()
{
    if(ans[dep]>s[dep])
    {
        for(int i=1;i<=dep;i++) ans[i]=s[i];
    }
}
void dfs(long long zi,long long
mu,int d) { long long a,b,w; if(d==dep) { s[d]=mu; if((zi==1)&&s[d]>s[d-1]) outp(); return; } for(int i=max(s[d-1]+1,mu/zi+1);i<(dep-d+1)*mu/zi;i++)//此步驟著重理解, { // 由上一步和dep深度決定i的取值範圍 b=mu*i/gcd(mu,i); a
=b*zi/mu-b/i; w=gcd(a,b); a/=w;b/=w; s[d]=i; dfs(a,b,d+1); } } int main(){ scanf("%lld%lld",&ch,&mo); int i=gcd(ch,mo); ch/=i; mo/=i; for(dep=2;;dep++) { ans[1]=0; s[0]=0; ans[dep]=200000000; dfs(ch,mo,1); if(ans[1
]!=0) break; } for(int j=1;j<=dep;j++) { printf("%d ",ans[j]); } return 0; }

埃及分數(叠代深搜)