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 について, その倍数のcntを 11 ずつ加算していく.
cnt[i] が 0 でないとき, ii は素数でないことに注意. 逆に,

if cnt[i] != 0 {
    continue
}

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

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

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

提出コード

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)
}