0
0

筆者はレート600前後の茶色コーダ

7/11開催のADTで登場した以下のABCの過去問題を解いていく

ADT(ALL)のページ

実装コード

$p\times q^3$ なので使う最大の素数は適当に$N^{\frac{1}{3}}$とみつもってエラトステネスのふるいをして
素数を列挙してみる。あとは素数なので組み合わせ被りを気にせず数え上げたらACした。

import sys
def rI(): return int(sys.stdin.readline().rstrip())
def rLI(): return list(map(int,sys.stdin.readline().rstrip().split()))
def rS(): return sys.stdin.readline().rstrip()
def rLS(): return list(sys.stdin.readline().rstrip().split())
def err(*args): print(*args, file=sys.stderr)

def sieve(n):
    is_prime = [True for _ in range(n+1)]
    is_prime[0] = False

    for i in range(2, n+1):
        if is_prime[i-1]:
            j = 2 * i
            while j <= n:
                is_prime[j-1] = False
                j += i
    table = [ i for i in range(1, n+1) if is_prime[i-1]]
    return is_prime, table

def main():
    N = rI()

    _, primes = sieve(int(N**(1/3)))
    M = len(primes)

    ans = 0
    for i,p in enumerate(primes):
        b = ans
        for j in range(i+1,M):
            num = p * (primes[j]**3)
            if num > N:
                break
            ans += 1
        if b == ans:
            break
    print(ans)
if __name__ == '__main__':
    main()

まとめ

ABC250Dを解いた、エラトステネスのふるいを利用して素数を列挙して順番に数え上げた。

感想

この問題は解説見ずにとけた早解き寄りの問題だった。
このような問題は切り口をみつければ簡単に解けるがそれまでがなかなか大変ですね。

余談

エラトステネスのふるいってなかなか名前覚えられないの自分だけ?

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0