SRM 388 250pt: SmoothNumbers

問題概要

xの最大の素因数がkを越えないとき、xをk-smooth numberと呼ぶ。N(<10^5), k(<100)が与えられるので、[1,N]にあるk-smooth numberの数を求める問題。

考えたこと

  • 基本的には書くだけに見える。全探索で普通に素因数分解してO(N^(3/2))。
  • だが1はどうなんだ?1に素因数なんてないんですけど…。サンプル見ても不明。
  • k=1のとき1はsmoothでないとして出したのは通らなかった。
  • 訂正して通ったけど後味悪い…。問題文が短かったことくらいしかいい所がない。

practiceで通ったコード

計算量O(N^(3/2))。

struct SmoothNumbers {

	int countSmoothNumbers(int N, int k) {

		int ret = 0;

		//全部試す
		for(int i=1; i<=N; i++){
			if(is_smooth(i, k)){
				ret++;
			}
		}

		return ret;
	}

	bool is_smooth(int x, int k){
		int ma = 0;
		for(int i=2; i*i <= x; i++){
			if(x % i == 0){
				ma = i;
				while(x%i == 0) x /= i;
			}
		}
		if( x != 1) ma = x;
		return ma <= k;
	}

};