输入输出样例
输入 #1 复制
2
12
输出 #1 复制
2
1/2 = 1/6 + 1/3
1/2 = 1/4 + 1/4
8
1/12 = 1/156 + 1/13
1/12 = 1/84 + 1/14
1/12 = 1/60 + 1/15
1/12 = 1/48 + 1/16
1/12 = 1/36 + 1/18
1/12 = 1/30 + 1/20
1/12 = 1/28 + 1/21
1/12 = 1/24 + 1/24
思路:1/k = 1/x+1/y ,当x=y ,他们都取2k,1/k = 1/2k+1/2k,如果x >2k ,y 必须更小,即y < 2k, y一直不能取到k,我们只需要检查 y 的取值范围,即 在[k+1,2k] 进行暴力枚举。如何计算x 呢? 1/x = 1/k - 1/y = (y-k) / (ky), x = ky / y-k.
#include<cstdio>
#include<vector>
using namespace std;
int main(){
int k;
while(scanf("%d",&k) == 1 && k){
vector<int> X,Y;
for(int y = k + 1; y <= k * 2; y++){//y一直不能取到k,我们只需要检查 y 的取值范围,即 在[k+1,2k] 进行暴力枚举
// 1/k = 1/x + 1/y => x = ky/(y-k)
if(k*y%(y-k) == 0)
{
X.push_back(k*y/(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;
}