埃及分数
迭代加深 DFS 枚举分母,比最大分母取优
正文
// 原题:https://oj.yecheng.tv/p/T1444
// 题意:把分数 a / b 表示成若干个互不相同的单位分数之和,要求项数最少,项数相同时让最小的那个分数尽量大(即最大分母尽量小),输出各分母。
// 思路:迭代加深 DFS,深度即项数。
// 1. 每层的分母严格递增,枚举下界由 1 / x <= 剩余值 与 x >= 上一个分母 + 1 共同决定。
// 2. 上界剪枝:剩下的 dep 项每项都不超过 1 / x,若 dep / x 仍小于剩余值则停止增大 x。
// 3. 固定深度内枚举全部解,比较时从最大分母开始比,越小越优。
// 复杂度:指数级搜索,深度较小时很快出解
// 易错点:分母必须互不相同,递归时下界是 x + 1 而不是 x。
// 易错点:中间分数会不断通分放大,long long 也可能溢出,乘法前先判断是否超过 LLONG_MAX / b。
#include <bits/stdc++.h>
using namespace std;
long long A, B;
int maxd;
long long cur[64], best[64];
bool hasBest = false;
void update(){
if(!hasBest){
for(int i = 0; i < maxd; i++) best[i] = cur[i];
hasBest = true;
return;
}
for(int i = maxd - 1; i >= 0; i--){
if(cur[i] != best[i]){
if(cur[i] < best[i]){
for(int k = 0; k < maxd; k++) best[k] = cur[k];
}
return;
}
}
}
void dfs(int dep, long long a, long long b, long long start){
if(dep == 1){
if(b % a) return;
long long x = b / a;
if(x < start) return;
cur[maxd - 1] = x;
update();
return;
}
for(long long x = start; ; x++){
if((__int128)a * x > (__int128)b * dep) break;
if(x > LLONG_MAX / b) break;
long long na = a * x - b;
if(na <= 0) continue;
long long nb = b * x;
long long g = std::gcd(na, nb);
na /= g;
nb /= g;
cur[maxd - dep] = x;
dfs(dep - 1, na, nb, x + 1);
}
}
int main(){
if(!(cin >> A >> B)) return 0;
for(maxd = 1; ; maxd++){
hasBest = false;
dfs(maxd, A, B, 1);
if(hasBest) break;
}
for(int i = 0; i < maxd; i++){
if(i) cout << " ";
cout << best[i];
}
cout << "\n";
return 0;
}
一本通·提高篇的其它内容
- 活动安排
- 种树
- 喷水装置
- 加工生产调度
- 智力大冲浪
- 数列极差
- 数列分段
- 线段
- 家庭作业
- 钓鱼
- 糖果传递
- 愤怒的牛
- Best Cow Fences
- 曲线
- 数列分段 II
- 扩散
- 灯泡
- 传送带
- 数的划分
- 生日蛋糕
- 小木棍
- Addition Chains
- 平板涂色
- 质数方阵
- 靶形数独
- 电路维修
- 魔板
- Knight Moves
- 棋盘游戏
- Keyboarding
- 移动玩具
- 山峰和山谷
- Oulipo
- 图书管理
- Power Strings
- Seekthe Name, Seek the Fame
- Friends
- A Horrible Poem
- Beads
- Antisymmetry
- 门票
- 收集雪花
- 剪花布条
- Power Strings
- Radio Transmission
- OKR-Periods of Words
- 似乎在梦中见过的样子
- Censoring
- Phone List
- The XOR Largest Pair
- Nikitosh 和异或
- Immediate Decodability
- L 语言
- Secret Message 秘密信息
- 背单词
- The Xor-longest Path
- Keywords Search
- 玄武密码
- Censoring
- 单词