璟雯院

珺璟如晔,雯华若锦

用户工具

站点工具


icpc:problems:埃及分数
problems
名称埃及分数
题目编号P1763
题目链接luogu.com.cn/…
来源Luogu
算法分类搜索, DFS, 迭代加深
难易程度小有难度

埃及分数

想法

对于每个位置的搜索下限为:剩余分数的倒数;上限为:将剩余分数平均分给剩余的位置的平均数。

代码实现

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
 
bool flag;
long long int n;
long long int line[20], ans[20];
 
void DFS(int x, long long int a, long long int b) {
	if(x > n) {
		if(a == 0) {
			flag = true;
			if(ans[n] > line[n])
				for(int i=1; i<=n; i++)
					ans[i] = line[i];
		}
 
		return ;
	}
	long long int l = max(b/a, line[x-1]+1), r = min((n-x+1)*(b/a), ans[n]);
	for (long long int i = l; i <= r; i++) {
		line[x] = i;
		long long int ta = a * i - b, tb = b * i, t = __gcd(ta, tb);
		if(ta < 0)continue;
		ta /= t; tb /= t;
		DFS(x+1, ta, tb);
	}
	return ;
}
 
int main() {
	long long int a, b;
	scanf("%lld %lld", &a, &b);
 
	while(!flag) {
		++n;
		ans[n] = 0x3f3f3f3f;
		DFS(1, a, b);
	}
 
	for (int i = 1; i <= n; ++i)
		printf("%lld ", ans[i]);
 
	return 0;
}
/app/www/public/data/pages/icpc/problems/埃及分数.txt · 最后更改: 2023/07/01 09:21 由 温婕莺