結果
問題 | No.1661 Sum is Prime (Hard Version) |
ユーザー | tamato |
提出日時 | 2021-08-27 23:08:17 |
言語 | PyPy3 (7.3.15) |
結果 |
WA
|
実行時間 | - |
コード長 | 2,196 bytes |
コンパイル時間 | 180 ms |
コンパイル使用メモリ | 82,028 KB |
実行使用メモリ | 333,916 KB |
最終ジャッジ日時 | 2024-11-21 05:00:06 |
合計ジャッジ時間 | 27,241 ms |
ジャッジサーバーID (参考情報) |
judge4 / judge5 |
(要ログイン)
テストケース
テストケース表示入力 | 結果 | 実行時間 実行使用メモリ |
---|---|---|
testcase_00 | AC | 75 ms
75,956 KB |
testcase_01 | WA | - |
testcase_02 | AC | 2,260 ms
292,444 KB |
testcase_03 | WA | - |
testcase_04 | WA | - |
testcase_05 | WA | - |
testcase_06 | AC | 74 ms
75,680 KB |
testcase_07 | AC | 73 ms
77,252 KB |
testcase_08 | WA | - |
testcase_09 | AC | 74 ms
75,372 KB |
testcase_10 | AC | 73 ms
76,152 KB |
testcase_11 | WA | - |
testcase_12 | WA | - |
testcase_13 | WA | - |
testcase_14 | AC | 2,010 ms
291,176 KB |
testcase_15 | WA | - |
testcase_16 | AC | 2,201 ms
297,024 KB |
testcase_17 | AC | 2,052 ms
290,896 KB |
testcase_18 | AC | 938 ms
208,696 KB |
testcase_19 | AC | 1,451 ms
275,020 KB |
testcase_20 | AC | 894 ms
210,548 KB |
testcase_21 | AC | 2,067 ms
292,268 KB |
testcase_22 | AC | 2,106 ms
292,012 KB |
testcase_23 | TLE | - |
ソースコード
from bisect import bisect def prime_sieve(n): """ Efficient prime sieve, due to Robert William Hanks. Source: http://stackoverflow.com/a/2068548 """ sieve = [True] * (n//2) for i in range(3,int(n**0.5)+1,2): if sieve[i//2]: sieve[i*i//2::i] = [False] * ((n-i*i-1)//(2*i)+1) return [2] + [2*i+1 for i in range(1,n//2) if sieve[i]] """ Limit controls the number of primes that are sieved to cache small values of pi(x). Without caching, runtime will be exponential. When computing pi(x), limit should be at least sqrt(x). A higher value of limit that caches more values can sometimes improve performance. """ limit = 10**6 primes = prime_sieve(limit) phi_cache = {} def phi(x, a): """ Implementation of the partial sieve function, which counts the number of integers <= x with no prime factor less than or equal to the ath prime. """ # If value is cached, just return it if (x, a) in phi_cache: return phi_cache[(x, a)] # Base case: phi(x, a) is the number of odd integers <= x if a == 1: return (x + 1) // 2 result = phi(x, a-1) - phi(x // primes[a-1], a-1) phi_cache[(x, a)] = result # Memoize return result pi_cache = {} def pi(x): """ Computes pi(x), the number of primes <= x, using the Meissel-Lehmer algorithm. """ # If value is cached, return it if x in pi_cache: return pi_cache[x] # If x < limit, calculate pi(x) using a bisection # algorithm over the sieved primes. if x < limit: result = bisect(primes, x) pi_cache[x] = result return result a = pi(int(x ** (1./4))) b = pi(int(x ** (1./2))) c = pi(int(x ** (1./3))) # This quantity must be integral, # so we can just use integer division. result = phi(x,a) + (b+a-2) * (b-a+1) // 2 for i in range(a+1, b+1): w = x // primes[i-1] b_i = pi(w ** (1./2)) result = result - pi(w) if i <= c: for j in range(i, b_i+1): result = result - pi(w // primes[j-1]) + j - 1 pi_cache[x] = result return result L, R = map(int, input().split()) print(pi(R) - pi(L) + pi(2*R-1) - pi(2*L))