題目描述
輸入正整數k,找到所有的正整數x>=y,使得1/k = 1/x + 1/y;
樣例輸入212
樣例輸出
21/2 = 1/6 + 1/3
1/2 = 1/4 + 1/4
81/8 =1/156 + 1/13
1/8 =1/84 + 1/14
1/8 =1/60 + 1/15
1/8 =1/48 + 1/16
1/8 =1/36 + 1/18
1/8 =1/30 + 1/20
1/8 =1/28 + 1/21
1/8 =1/24 + 1/24
題記暴力列舉法,但在列舉前可以進行簡單的演算,看能否確定乙個大致的列舉範圍以減少列舉量。x>=y => 1/x<=1/y ,1/x=1/k-1/y代入化簡得到y<=2k,因此只需在k+1~2k之間列舉y就行了;如果要驗證乙個x是否是乙個方程的解,x用int表示,求出來之後再代回原來的方程,成立則是解,反之不是(該方程的解是整數).
**如下
#include
#include
const
int maxn=
10000+10
;using
namespace std;
intmain()
}printf
("%d\n"
,cnt)
;for
(int i=
0;i)printf
("1/%d = 1/%d + 1/%d\n"
,k,numx[i]
,numy[i]);
}return0;
}
UVA 10976 分數拆分
題目描述 既然要求找出所有的x y,列舉物件自然就是x y了。可問題在於,列舉的範圍如何?從1 12 1 156 1 13可以看出,x可以比y大很多。難道要無休止地列舉下去?當然不是。由於x y,有 因此 即y 2k。這樣,只需要在2k範圍之內列舉y,然後根據y嘗試計算出x即可。在這需要用到乙個判斷...
UVA 10976 暴力列舉
給定正整數k 1 k 10000 找出所有正整數 x y,使得1 k 1 x 1 y.首先,x,y肯定為整數,所以x,y的取值範圍不能小於k,即左區間為k 1,因為x y,1 x 1 y,即1 k 1 y 1 y,所以,1 k 2 y,所以2k y,所以y的取值範圍就出來了,k 1,2 k incl...
UVA10976摸魚的暴力列舉初步
我一開始的想法超時了.其實想法也還好,裡面有兩個需要優化的地方.1 通常做法是y 2 k 然後從k開始列舉的.其實想一下也是,從二倍然後加加加 2 我 的順序反了 完全不需要stack啊.開兩個陣列存一下就好了,因為你免不了要輸出sum,所以這個儲存繞不開的 哪怕是y倒著開始.或者 是什麼的.3 暴...