埃及分数(迭代深搜)

Posted 719666a

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了埃及分数(迭代深搜)相关的知识,希望对你有一定的参考价值。

#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;
}

 

以上是关于埃及分数(迭代深搜)的主要内容,如果未能解决你的问题,请参考以下文章

一本通例题埃及分数—题解&&深搜的剪枝技巧总结

迭代深搜(ID-DFS)是啥?

Vijos 1308 埃及分数(迭代加深搜索)

埃及分数,迭代加深

迭代加深,埃及分数

[题解]「一本通 1.3 练习 1」埃及分数