AOJ0162 Hamming Numbers
問題リンク Hamming Numbers
- 解法
整数NがハミングナンバーかどうかはN未満の数全てについてハミングナンバーの真偽が求まっていればすぐ分かります。Nが2の倍数かつN/2がハミングナンバーならば真。3と5についても同様です。また、同時に整数Nまでのハミングナンバーの個数を覚えておくとM以上N以下のハミングナンバーの個数がO(1)で求まります。
- ソース
import java.util.Scanner; //Hamming Numbers public class AOJ0162 { public static void main(String[] args) { boolean[] h = new boolean[1000001]; h[1] = true; int[] s = new int[1000001]; s[1] = 1; for(int i=2;i<1000001;i++){ if(i%2==0&&h[i/2])h[i]=true; if(i%3==0&&h[i/3])h[i]=true; if(i%5==0&&h[i/5])h[i]=true; s[i] = s[i-1] + (h[i]?1:0); } Scanner sc = new Scanner(System.in); while(true){ int m = sc.nextInt(); if(m==0)break; int n = sc.nextInt(); System.out.println(s[n]-s[m-1]); } } }