调了一天了,各个题解什么数据都试过了,甚至还找到了Hack题解的数据,uDebug上试过了格式也没问题,但是就是过不了,求救
#include <cstdio>
#include <cstring>
#include <algorithm>
#define int long long
int t,k,l,q[10000];
long long n,m,ord[10000],chk[10000];
long long max(long long x,long long y){
return x>y?x:y;
}
long long gcd(long long x,long long y){
return x%y==0?y:gcd(y,x%y);
}
bool dfs(long long a,long long b,int remain,long long min){
bool flag=false;
if(a<=0)return false;
long long g=gcd(a,b);
a/=g;b/=g;
if(remain==1)chk[l-remain]=b;
if(remain==1&&a==1){
for(register int i=0;i<k;i++)if(b==q[i])return false;
int tag=0;
for(register int i=l-1;i>=0;i++){
if(chk[i]>ord[i])tag=-1;
if(chk[i]<ord[i])tag=1;
if(tag!=0)break;
}
for(register int i=0;i<l;i++)for(register int j=i+1;j<l;j++)if(chk[i]>=chk[j])return false;
if(tag==1)for(register int i=0;i<l;i++)ord[i]=chk[i];
return true;
}
if(remain==1&&a!=1)return false;
for(register long long i=max(max(b/a,min+1),1);i<b*remain/a+(b*remain%a==0?0:1);i++){
chk[l-remain]=i;
bool tag=true;
for(register int j=0;j<k;j++)if(i==q[j])tag=false;
if(!tag)continue;
if(dfs((a*i-b),i*b,remain-1,i))flag=true;
}
return flag;
}
signed main(){
//freopen("testdata.txt","w",stdout);
scanf("%lld",&t);
for(register int i=0;i<t;i++){
scanf("%lld %lld %lld",&n,&m,&k);
for(register int j=0;j<k;j++)scanf("%lld",&q[j]);
std::sort(q,q+k);
for(register int j=0;j<10000;j++)ord[j]=9223372036854775807;
printf("Case %lld: %lld/%lld=",i+1,n,m);
for(l=1;l<10000;l++)if(dfs(n,m,l,0))break;
if(l==10000)printf("0");
else{
for(register int j=0;j<l;j++){
printf("1/%lld",ord[j]);
if(j!=l-1)printf("+");
}
}
printf("\n");
memset(ord,0,sizeof(ord));
}
return 0;
}
/*
1
5 121 0
*/