WA求助,udebug数据能过
查看原帖
WA求助,udebug数据能过
344490
WindowsXp_sjtu楼主2020/8/13 16:14

udebug第一组第二组数据都 identical to the accepted output

代码如下

#include <cstdio>
#include <cstring>

typedef long long int LL;
const int max_n=100000+5;
int max_d;
LL k;
LL v[max_n];//过程数组
LL ans[max_n];//答案数组
LL forbid[5];//不能使用的数
LL gets_first(LL a,LL b){
   return b/a+1;
}
LL max(LL a,LL b){
    return a>b?a:b;
}
LL gcd(LL a,LL b){
    return b?gcd(b,a % b):a;
}
bool better(int d){
    for (int i = d; i>=0 ; i--) if (v[i]!=ans[i]){
        return ans[i]==-1||v[i]<ans[i];
    }
    return false;
}
bool dfs(int d,LL from,LL aa,LL bb){
    if (d==max_d){
        if (bb%aa||bb/aa<=from)return false;
        v[d]=bb/aa;
        if (better(d))memcpy(ans,v,sizeof(LL)*(max_d+1));
        return true;
    }
    int start=max(from,gets_first(aa,bb));
    bool flag=false;
    for (int i = start; ; ++i) {
        if (bb*(max_d-d+1)<aa*i)break;//剪枝
        bool flag2=false;
        for (int j = 0; j < k; ++j) {
            if (forbid[j]==i)flag2=true;
        }
        if (flag2) continue;
        v[d]=i;
        LL new_a = aa*i-bb;
        LL new_b = bb*i;
        LL g=gcd(new_a,new_b);
        if (dfs(d+1,i+1,new_a/g,new_b/g))flag=true;
    }
    return flag;
}
int main() {
    LL t,a,b;
    scanf("%lld",&t);
    for (int i = 0; i < t; ++i) {
        scanf("%lld%lld%lld",&a,&b,&k);
        for (int j = 0; j < k; ++j) {
            scanf("%lld",&forbid[j]);
        }
        memset(ans,-1,sizeof(ans));
        memset(v,-1,sizeof(v));
        printf("Case %d: %lld/%lld=",i+1,a,b);
        for (max_d = 1;;++max_d) {
            if (dfs(0,gets_first(a,b),a,b)){
                printf("1/%lld",ans[0]);
                for (int j = 1; ans[j]>0; ++j) {
                    printf("+1/%lld",ans[j]);
                }printf("\n");
                break;
            }
        }
    }
    return 0;
}

2020/8/13 16:14
加载中...