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;
}