紫书刷题进行中,题解系列【GitHub|CSDN】
例题7-3 UVA10976 Fraction Again(16行AC代码)
题目大意
给定正整数k,求1/k=1/x+1/y,x>=y
的所有解,若存在多解,x大者在前
思路分析
简单的二元一次方程求解,枚举x或y,即可求出对方值。关键在于如何确定枚举范围,根据题目条件,可进行如下公式推导,得到y的枚举区间:(k,2k]
根据题意可知 x>=y>0 => 1/x<=1/y (不等式1)
已知:1/k=1/x+1/y (等式1)
根据等式1推导出 x=(yk)/(y-k) => y > k (范围1)
将不等式1带入等式1: 1/k=1/x+1/y <= 1/y+1/y => y <= 2k(范围2)
综上,k<y<=2k
AC代码(C++11,不等式推导)
#include<bits/stdc++.h>
using namespace std;
int main() {
int k;
while (scanf("%d", &k) == 1) {
vector<int> X, Y; // 存储答案
for (int y=k+1; y <= 2*k; y ++)
if (y*k%(y-k) == 0) {
X.push_back(y*k/(y-k));
Y.push_back(y);
}
printf("%d\n", X.size());
for (int i=0; i < X.size(); i ++) printf("1/%d = 1/%d + 1/%d\n", k, X[i], Y[i]);
}
return 0;
}