Hướng dẫn giải của Primes and Clock


Chỉ dùng lời giải này khi không có ý tưởng, và đừng copy-paste code từ lời giải này. Hãy tôn trọng người ra đề và người viết lời giải.
Nộp một lời giải chính thức trước khi tự giải là một hành động có thể bị ban.

Tác giả: 03_01_00

Bài này cần một kĩ thuật kiểm tra số nguyên tố tốt hơn sàng nguyên tố hay kiểm tra đến căn thông thường mới có thể ăn được hết các test, code tham khảo mình để ở đây:

import random

def power(x, y, p):
    res = 1
    x = x % p
    while y > 0:
        if (y & 1):
            res = (res * x) % p;
        y = y >> 1
        x = (x * x) % p
    return res

def miillerTest(d, n):
    a = 2 + random.randint(1, n - 4)
    x = power(a, d, n)
    if x == 1 or x == n - 1:
        return True
    while d != n - 1:
        x = (x * x) % n
        d *= 2
        if x == 1:
            return False
        if x == n - 1:
            return True
    return False

def isPrime(n, k):
    if n <= 1 or n == 4:
        return False
    if n <= 3:
        return True
    d = n - 1
    while d % 2 == 0:
        d //= 2
    for i in range(k):
        if miillerTest(d, n) == False:
            return False
    return True

a = [0, 1, 2, -1, -1, 5, 9, -1, 8, 6]

def upSideDown(N):
    res = 0
    while N:
        digit = N % 10
        N = N // 10
        if a[digit] == -1:
            return False, res
        res = res * 10 + a[digit]
    return True, res

if __name__ == '__main__':
    K = 4
    for i in range(int(input())):
        N = int(input())
        oke, revN = upSideDown(N)
        if oke and isPrime(N, K) and isPrime(revN, K):
            print("YES")
        else:
            print("NO")

Bình luận

Hãy đọc nội quy trước khi bình luận.


Không có bình luận tại thời điểm này.