※上記の広告は60日以上更新のないWIKIに表示されています。更新することで広告が下部へ移動します。

Problem 73 「ある範囲内の分数の数え上げ」 †

nとdを正の整数として, 分数 n/d を考えよう. n<d かつ HCF(n,d)=1 のとき, 真既約分数と呼ぶ.

d ≤ 8 について既約分数を大きさ順に並べると, 以下を得る:

1/8, 1/7, 1/6, 1/5, 1/4, 2/7, 1/3, 3/8, 2/5, 3/7, 1/2, 4/7, 3/5, 5/8, 2/3, 5/7, 3/4, 4/5, 5/6, 6/7, 7/8
1/3と1/2の間には3つの分数が存在することが分かる.

では, d ≤ 12,000 について真既約分数をソートした集合では, 1/3 と 1/2 の間に何個の分数があるか?



解法
とりあえずファレイ数列で全探索しました。
ちょっと遅いのでもう少し賢い方法がありそうです。

calc(_,DL,_,DR,_):-
 	DL+DR>12000,
	!,
	fail.
calc(_,_,_,_,1).
calc(UL,DL,UR,DR,Result):-
	MU is UL+UR,
	ML is DL+DR,
	calc(UL,DL,MU,ML,Result).
calc(UL,DL,UR,DR,Result):-
	MU is UL+UR,
	ML is DL+DR,
	calc(MU,ML,UR,DR,Result).

main73:-
	findall(C,calc(1,2,1,3,C),Count),
	length(Count,Ans),
	write(Ans).