蒟蒻求救
查看原帖
蒟蒻求救
189995
constexpr楼主2021/5/22 16:23

调了一天了,各个题解什么数据都试过了,甚至还找到了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
*/
2021/5/22 16:23
加载中...