洛谷上的AC了,但这里的过不了
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=1e7+5;
int T,a,b,k,p[N],ans[N];
bool use[N];
ll gcd(ll a,ll b){
if(!b) return a;
return gcd(b,a%b);
}
struct Frac{
ll a,b;
Frac maintain(){
ll d=gcd(a,b);
a/=d;
b/=d;
return {a,b};
}
Frac operator-(Frac k){
ll d=gcd(b,k.b),na=k.b/d*a-b/d*k.a,nb=b/d*k.b;
Frac tmp={na,nb};
return tmp.maintain();
}
};
bool better(int limit){
for(int i=limit;i>=1;i--)
if(p[i]!=ans[i]) return p[i]<ans[i];
return 0;
}
bool dfs(int limit,int depth,Frac rest,int last){
if(depth==limit+1) return 0;
int l=max(1ll*(last+1),rest.b/rest.a+!!(rest.b%rest.a)),r=rest.b*(limit-depth+1)/rest.a;
bool f=0;
for(int i=l;i<=r;i++){
if(i<=1000&&use[i]) continue;
p[depth]=i;
if(rest.a==1&&rest.b==i){
if(better(limit))
for(int j=1;j<=limit;j++)
ans[j]=p[j];
return 1;
}
f|=dfs(limit,depth+1,rest-Frac{1,i},i);
}
return f;
}
int main(){
scanf("%d",&T);
memset(ans,0x7f,sizeof(ans));
for(int t=1;t<=T;t++){
memset(use,0,sizeof(use));
scanf("%d%d%d",&a,&b,&k);
for(int i=1,x;i<=k;i++){
scanf("%d",&x);
use[x]=1;
}
Frac rest=Frac{a,b}.maintain();
for(int limit=1;;limit++)
if(dfs(limit,1,rest,1)){
printf("Case %d: %d/%d=",t,a,b);
for(int i=1;i<limit;i++)
printf("1/%d+",ans[i]);
printf("1/%d",ans[limit]);
for(int i=1;i<=limit;i++){
ans[i]=0x7f7f7f7f;
p[i]=0;
}
break;
}
putchar('\n');
}
return 0;
}