count predisposition

2 secs 1024 MB
nikoro1024's icon nikoro1024

この問題はエラトステネスの篩を応用したDPによる前計算で解くことができます。
具体的には2~10⁶の配列DPを作り2~10⁶まで以下の動作を繰り返します。
⇒DPiが0の時iの倍数を全て+1する。
クエリが呼ばれた際はDPnを呼び出すことによって問題全体をo(Q+NloglogN)で解くことができました。

またこの問題はspf法(smallest prime facter)を利用して解くことも出来ます。

サンプルコード(python)

dp=[0 for _ in range(10**6+1)]
for i in range(2,10**6+1):
    if dat[i]==0:
        j=i
        while j<=10**6:
            dp[j]+=1
            j+=i
Q=int(input())
for _ in range(Q):
    N=int(input())
    print(dat[N])