Fractions Again?! |
Timelimit: 1 second |
It is easy to see that for every fraction in the form (k > 0), we can always find two positive integersx and y, x ≥ y, such that:
.
Now our question is: can you write a program that counts how many such pairs of x and y there are for any given k?
Input
Input contains no more than 100 lines, each giving a value of k (0 < k ≤ 10000).
Output
For each k, output the number of corresponding (x, y) pairs, followed by a sorted list of the values of x and y, as shown in the sample output.
Sample Input
2 12
Sample Output
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
分析:数论,枚举。枚举所有在区间(k+1,2k)上的y即可,当1/k - 1/y的结果分子为1即为一组解。
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <set>
#include <queue>
using namespace std;
#define maxn 10005
#define inf 0x7ffffff
pair <int ,int > p;
int arr[maxn];
int brr[maxn];
int n;
//int cmpD(Node a,Node b){
// return a.h > b.h;
//}
//int cmpI(Node a,Node b){
// return a.h < b.h;
//}
int main()
{
while(scanf("%d",&n) != EOF){
int cnt = 0;
for(int i = n +1; i <= 2 *n;i++){
if((i*n) % (i - n) == 0){
arr[cnt] = i;
brr[cnt] = (i*n) / (i - n);
cnt ++;
//printf("1/%d=1/%d+1/%d\n",n,(i*n)/(i-n),i);
}
}
printf("%d\n",cnt);
for(int i = 0; i < cnt; i++){
printf("1/%d = 1/%d + 1/%d\n",n,brr[i],arr[i]);
}
}
return 0;
}