RE求助
查看原帖
RE求助
724648
light_searcher楼主2023/9/30 10:47

洛谷上的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;
}
2023/9/30 10:47
加载中...