Problem:
ハミング数

1 に 2, 3, 5 を何回か (0 回以上) かけ算して得られる数をハミング数 (Hamming numbers) と呼びます。例えば、

1

1 × 2 × 2 = 4

1 × 2 × 2 × 3 × 5 × 5 = 300

などはハミング数ですが、11, 13, 14 などはハミング数ではありません。

ハミング数はどれも 60 のべき乗を割り切る(例えば、54 は 603 = 21600 を割り切る) ので、時刻など 60 進法の計算には都合の良い数として昔から知られていました。また、楽器の調律に用いる音階の一つである純正律では、音の周波数の比が 24, 27, 30, 32, 36, 40, 45, 48 というハミング数からなる数列になります。

整数 m、n を入力とし、m 以上 n 以下のハミング数の個数を出力するプログラムを作成してください。

Input

複数のデータセットの並びが入力として与えられます。入力の終わりはゼロひとつの行で示されます。

各データセットとして、２つの整数 m と n (1 ≤ m, n ≤ 1000000, m ≤ n) が空白区切りで１行に与えられます。

データセットの数は 20 を超えません。

Output

データセットごとに m 以上 n 以下のハミング数の個数を１行に出力します。

Sample Input

3 8
1 27
1 86
0

Output for the Sample Input

5
17
31

Solution in JAVA (judge verdict: Accepted)

import java.util.*;
public class Main 
{
	public static void main(String[] args) 
	{
		Scanner stdIn = new Scanner(System.in);
		while(stdIn.hasNext())
		{
			int s = stdIn.nextInt();
			if(s == 0)
			{
				break;
			}
			int t = stdIn.nextInt();
			Queue<Integer> que1 = new ArrayDeque<Integer>();
			Queue<Integer> que2 = new ArrayDeque<Integer>();
			boolean[] flag1 = new boolean[t + 1];
			boolean[] flag2 = new boolean[s + 1];
			int count1 = 0;
			int count2 = 0;
			if(s == 1)
			{
				++count1;
			}
			que1.add(1);
			while(!que1.isEmpty())
			{
				int n = que1.poll();
				if(n * 2 <= t && !flag1[n * 2])
				{
					flag1[n * 2] = true;
					que1.add(n * 2);
					++count1;
				}
				if(n * 3 <= t && !flag1[n * 3])
				{
					flag1[n * 3] = true;
					que1.add(n * 3);
					++count1;
				}
				if(n * 5 <= t && !flag1[n * 5])
				{
					flag1[n * 5] = true;
					que1.add(n * 5);
					++count1;
				}
			}
			que2.add(1);
			while(!que2.isEmpty())
			{
				int n = que2.poll();
				if(n * 2 < s && !flag2[n * 2])
				{
					flag2[n * 2] = true;
					que2.add(n * 2);
					++count2;
				}
				if(n * 3 < s && !flag2[n * 3])
				{
					flag2[n * 3] = true;
					que2.add(n * 3);
					++count2;
				}
				if(n * 5 < s && !flag2[n * 5])
				{
					flag2[n * 5] = true;
					que2.add(n * 5);
					++count2;
				}
			}
			System.out.println(count1 - count2);
		}
	}
}