代码如下(写了一个小时,结果waiting):
#include<bits/stdc++.h>
using namespace std;
int tt,a,b,k,q,deep,t[1010],ans[1010],mins,ttt;
bool flag[10000010],ok;
void dfs(int now,int k,int a,int b){
if(a==0){
if(t[deep]<mins){
memcpy(ans,t,sizeof(int)*(deep+1));
mins=t[deep];
}
ok=1;
return;
}
if(now>deep) return;
for(int i=max(k+1,(int)ceil(b*1.0/a));i<=min((int)ceil((deep-now+1)*b*1.0/a),(int)1e7);i++){
if(flag[i]) continue;
int g=b*i/__gcd(b,i);
t[now]=i;
dfs(now+1,i,g/b*a-g/i,g);
}
}
signed main(){
scanf("%d",&tt);
while(tt--){
ttt++;
scanf("%d%d%d",&a,&b,&k);
memset(flag,0,sizeof(flag));
for(int i=1;i<=k;i++){
scanf("%d",&q);
flag[q]=1;
}
printf("Case %d: %d/%d=",ttt,a,b);
ok=0;
mins=1e9;
for(deep=1;!ok;deep++) dfs(1,1,a,b);
for(int i=1;i<deep;i++){
if(i>1) printf("+");
printf("1/%d",ans[i]);
}
printf("\n");
}
return 0;
}