【IDDFS】——UVA12558——诶及分数

题意:求n,m的诶及分数,有k个数不能用。

思路:把k个数当做搜索失败就行

代码如下:

#include<iostream>
#include<string.h>
#include<stdio.h>
using namespace std;

typedef long long LL;

int maxd;
LL n,m,k;
LL ans[10010];
LL tmp[10010];
LL ban[10];
int flag;

LL gcd(LL a,LL b)
{
    return b==0?a:gcd(b,a%b);
}

bool isb(LL a)
{
    for(int i=0;i<k;i++)
    {
        if(a==ban[i])
            return true;
    }
    return false;
}

bool better()
{
    for(int i=maxd;i>=0;--i)
    {
         if(tmp[i]!=ans[i])
            return tmp[i]<ans[i];
    }
    return 0;
}

void dfs(int d,LL a,LL b)
{
    if(d==maxd)
    {
        if(b%a)return ;
        tmp[d]=b/a;
        if(isb(b/a))return ;

        if(better()||flag==0)
            memcpy(ans,tmp,sizeof(LL)*(d+1));
        flag=1;
        return ;
    }

    for(int i =max(b/a,tmp[d-1])+1; ; i++)
    {
        if(b * (maxd+1-d) <= i * a) break;
         if(isb(i))continue;

        tmp[d] = i;
        LL b2 = b*i;
        LL a2 = a*i - b;
        LL g = gcd(a2, b2);

         dfs(d+1 ,  a2/g ,  b2/g);
    }
}

int main()
{
    int t;
    cin>>t;
    for(int z=1;z<=t;z++)
    {
        cin>>n>>m>>k;
        for(int i=0;i<k;i++)
            cin>>ban[i];

        for(maxd=0;;maxd++)
        {
            flag=0;
            dfs(0,n,m);
            if(flag==1)
                break;
        }

         cout << "Case " <<z<< ": ";
         if(flag==1)
        {
            cout << n << "/" << m << "=";
            for(int i = 0; i < maxd; i++)
                cout << "1/" << ans[i] << "+";
            cout << "1/" << ans[maxd] << "\n";
        }
        else cout << "No solution.\n";
    }
    return 0;
}

 

posted @ 2016-07-08 17:24  琥珀川||雨露晨曦  阅读(171)  评论(0)    收藏  举报