AtCoder Beginner Contest 084 / D - 2017-like Number
解法
- エラトステネスのふるいで、制約条件である100000までの素数表を作る (myo)
- 1で作成した素数表をもとに、2017に似た数 表を作る (r2017)
- r2017_ の累積和を取る (rodd)__
- Qのクエリに rodd[$ r_{i+1} $] - rodd[ $l_i$ ] で答えていく。
def eratos(n :int): # initialize isprime = [True] * (n+1) isprime[0] = isprime[1] = False for i in range(2, int(math.sqrt(n)+1)): if(isprime[i]): j = i+i while(j <= n): isprime[j] = False j = j+i return isprime def solve(Q: int, l: "List[int]", r: "List[int]"): myo = eratos(100000) rodd = [0]*100001 r2017 = [False]*100001 for i in range(1,100001): if(i%2 == 0): continue elif(myo[i] and myo[int((i+1)/2)]): r2017[i] = True for i in range(2,100001): rodd[i] = rodd[i-1] +(1 if r2017[i-1] else 0) ans = [0]*Q for i in range(Q): ans[i] = rodd[r[i]+1] - rodd[l[i]] for i in ans: print(i) return
参考
@drkenさんの神解説