It is easy to see that for every fraction in the form
(
k > 0), we can always find two positive integers
x 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 题意:暴力求解;由于x>=y; 1 / x <= 1 / y; 可以推出 y <= 2 * k; 只要在2*k的范围进行枚举就可以;#include <cstdio> #include <cmath> #include <iostream> #include <cstring> using namespace std; #define ll long long int #define MAXN 10000 ll a[MAXN]; ll b[MAXN]; void printout(ll k, ll n){ printf("%lld\n", n); for(int i=0; i<n; i++){ printf("1/%lld = 1/%lld + 1/%lld\n", k, a[i], b[i]); } } void play(ll k){ ll y = 1; ll cnt = 0; memset(a, 0, sizeof(a)); memset(b, 0, sizeof(b)); for(y=1; y<=2*k; y++){ double x = 1.0 / (1.0/k - 1.0/y); ll xInt = (ll)(x+0.5); //閫夌敤1e-4, if(x>0 && fabs(x-xInt)<1e-4){ a[cnt] = xInt; b[cnt] = y; cnt++; } } printout(k, cnt); } int main(){ ll k; while(scanf("%lld",&k) != EOF){ play(k); } return 0; }