分数拆分 Fractions Again?!
题面翻译
输入正整数k,找到所有的正整数 x ≥ y x \ge y x≥y,使得 1 k = 1 x + 1 y \frac{1}{k}=\frac{1}{x}+\frac{1}{y} k1=x1+y1
Translated by @陶文祥
题目描述
输入格式
输出格式
样例 #1
样例输入 #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
分析:
首先把题意搞懂:题目就是让我们求出两个整数x,y;使得1/x+1/y=1/n。
咋做呢???
枚举!!!(你们自己去一个个枚举吧,我不会枚举QWQ)
正文
既然我们要求出满足要求的x,y,我们不妨先看看x,y的关系:
x>=y
,那我们能不能求出x,y的范围呢???
∵1/n=1/x+1/y, 1/n=1/(n/2)+1/(n/2)
∴x,y最大值不能超过n/2
又∵1/n=0+1/n,xy必须为整数
∴x,y最小值不能小于n+1
总结:n+1≤x,y≤n/2
已经求出了范围,我们就来求求x,y~~
我们再来看看这个方程:1/x+1/y=1/n
左右两边同时乘上一个y得:y/x+1=y/n
左右两边再同时乘上一个n得:y*n/x+n=y
左右两边再~同时乘上一个x得:y*n+n*x=y*x
移项得:y*n=y*x-n*x
合并同类项得:y*n=x*(y-n)
在这个方程中,x的个数只有1个,所以我们可以把x给单独提出来:(y*n)/(y-n)=x
在上文中,我们已经求出了y的范围了,所以我们直接枚举就行啦~~~
代码:
#include<bits/stdc++.h>
using namespace std;
int n;
int x[10000],y[10000];//要求的x,y
int main()
{
while(scanf("%d",&n)!=EOF)
{
int k=0;//即有多少组满足要求的x,y
memset(x,0,sizeof(x));//清空数组
memset(y,0,sizeof(y));
for(int i=n*2;i>=n+1;i--)//在y的范围里枚举
{
if((n*i)%(i-n)==0)//只要x能为整数
{
k++;
x[k]=(i*n)/(i-n);//将x存入数组x里
y[k]=i;//将y存入数组y里
}
}
cout<<k<<endl;//按要求输出
for(int i=k;i>=1;i--)//不知道为什么要从后往前输出,开始是从前往后输出的,样例是反着的QAQ
{
printf("1/%d = 1/%d + 1/%d",n,x[i],y[i]);
cout<<endl;//换行
}
}
return 0;
}
结束啦~~~