这怎么就RE了...
查看原帖
这怎么就RE了...
294562
EDqwq楼主2022/3/1 18:29
#include<bits/stdc++.h>

#define int long long
#define mem(x,y) memset(x,y,sizeof(x))
#define frein freopen("in.in","r",stdin)
#define freout freopen("out.out","w",stdout)
#define debug(x) cout << (#x) << " = " << x << endl;

using namespace std;

int read(){
   int s = 0,w = 1;
   char ch = getchar();
   while(ch < '0' || ch > '9'){if(ch == '-')w = -1;ch = getchar();}
   while(ch >= '0' && ch <= '9')s = s * 10 + ch - '0',ch = getchar();
   return s * w;
}

int t;
int n,m;
int a[1000010];
int ans[1000010];
bool flag;
bool bk[100010];

int gcd(int x,int y){
	if(!y)return x;
	return gcd(y,x % y);
}

void dfs(int dep,int x,int y,int maxdep){
	if(dep > maxdep)return ;
	if(x == 1 && y > a[dep - 1] && !bk[y]){
		a[dep] = y;
		if(!flag || a[dep] < ans[dep])for(int i = 1;i <= maxdep;i ++)ans[i] = a[i];
		flag = true;
		return ;
	}
	int l = max(y / x,a[dep - 1] + 1);
	int r = (maxdep - dep + 1) * y / x;
	if(flag && r >= ans[maxdep])r = ans[maxdep] - 1;
	for(int i = l;i <= r - 1;i ++){
		if(bk[i])continue;
		a[dep] = i;
		int gcdd = gcd(x * i - y,y * i);
		dfs(dep + 1,(x * i - y) / gcdd,y * i / gcdd,maxdep);
	}
}

signed main(){
	cin>>t;
	for(int kunbar = 1;kunbar <= t;kunbar ++){
		mem(bk,false);
		mem(a,0);
		flag = false;
		n = read(),m = read();
		int k;
		k = read();
		for(int i = 1;i <= k;i ++){
			int x;
			x = read();
			bk[x] = true;
		}
		int gcddd = gcd(n,m);
		n /= gcddd,m /= gcddd;
		a[0] = 1;
		printf("Case %lld: %lld/%lld=",kunbar,n,m);
		for(int i = 1;i <= 100;i ++){
			dfs(1,n,m,i);
			if(flag){
				for(int j = 1;j <= i - 1;j ++)printf("1/%lld+",ans[j]);
				printf("1/%lld\n",ans[i]);
				break;
			}
		}
	}
}

主题库的埃及分数已经AC了...

2022/3/1 18:29
加载中...