030 - K Factors(★5)

030 - K Factors(★5)

キーワード

解説

問題 (opens in a new tab)

素因数列挙の典型問題.

cnt := make([]int, 10000000+1)
for i := 2; i <= n; i++ {
    if cnt[i] != 0 {
        continue
    }
    for j := i; j <= n; j += i {
        cnt[j]++
    }
}

i=2,,Ni = 2, \dots , N について, その倍数のcnt11 ずつ加算していく.
cnt[i] が 0 でないとき, ii は素数でないことに注意. 逆に,

if cnt[i] != 0 {
    continue
}

で早期リターンされない ii は素数.

jjii の倍数であるため, jjii を素因数に持つ.
cnt[i]kk 以上であるならば, iikk 種類以上の素因数を持つことがいえる.

例えば, 6622 の倍数列 2,4,6,2, 4, 6, \dots33 の倍数列 3,6,9,3, 6, 9, \dots の両方に含まれるため, 少なくとも 2233 を素因数に持つことが言える.

提出コード

func main() {
	var n, k int
	scanIntVariables(&n, &k)
 
	cnt := make([]int, 10000000+1)
	for i := 2; i <= n; i++ {
		if cnt[i] != 0 {
			continue
		}
		for j := i; j <= n; j += i {
			cnt[j]++
		}
	}
 
	ans := 0
	for i := 2; i <= n; i++ {
		if cnt[i] >= k {
			ans++
		}
	}
	writeLine(ans)
}