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 由 温婕莺