結果
| 問題 | 
                            No.1955 Not Prime
                             | 
                    
| コンテスト | |
| ユーザー | 
                             lam6er
                         | 
                    
| 提出日時 | 2025-04-09 21:04:35 | 
| 言語 | PyPy3  (7.3.15)  | 
                    
| 結果 | 
                             
                                AC
                                 
                             
                            
                         | 
                    
| 実行時間 | 435 ms / 2,000 ms | 
| コード長 | 2,418 bytes | 
| コンパイル時間 | 292 ms | 
| コンパイル使用メモリ | 82,332 KB | 
| 実行使用メモリ | 238,696 KB | 
| 最終ジャッジ日時 | 2025-04-09 21:06:16 | 
| 合計ジャッジ時間 | 5,091 ms | 
| 
                            ジャッジサーバーID (参考情報)  | 
                        judge1 / judge5 | 
(要ログイン)
| ファイルパターン | 結果 | 
|---|---|
| other | AC * 26 | 
ソースコード
import sys
sys.setrecursionlimit(1 << 25)
def main():
    max_prime = 10**6
    sieve = [True] * (max_prime + 1)
    sieve[0] = sieve[1] = False
    for i in range(2, int(max_prime**0.5) + 1):
        if sieve[i]:
            for j in range(i*i, max_prime + 1, i):
                sieve[j] = False
    N = int(sys.stdin.readline())
    pairs = [tuple(map(int, sys.stdin.readline().split())) for _ in range(N)]
    size = 2 * N
    adj = [[] for _ in range(2 * N * 2)]
    for i in range(N):
        a_i, b_i = pairs[i]
        for j in range(N):
            a_j, b_j = pairs[j]
            for x in [0, 1]:
                s = a_i if x == 0 else b_i
                for y in [0, 1]:
                    t = b_j if y == 0 else a_j
                    concat = int(f"{s}{t}")
                    if concat > max_prime:
                        is_p = False
                    else:
                        is_p = sieve[concat]
                    if is_p:
                        xi_node = 2 * i + (1 if x == 0 else 0)
                        not_yj_node = 2 * j + (0 if y == 0 else 1)
                        adj[xi_node].append(not_yj_node)
                        yj_node = 2 * j + (1 if y == 0 else 0)
                        not_xi_node = 2 * i + (0 if x == 0 else 1)
                        adj[yj_node].append(not_xi_node)
    visited = [False] * (2 * N)
    order = []
    def dfs(u):
        if visited[u]:
            return
        visited[u] = True
        for v in adj[u]:
            if not visited[v]:
                dfs(v)
        order.append(u)
    for u in range(2 * N):
        if not visited[u]:
            dfs(u)
    visited = [False] * (2 * N)
    component = [0] * (2 * N)
    current = 0
    def reverse_dfs(u, current):
        stack = [u]
        while stack:
            node = stack.pop()
            if visited[node]:
                continue
            visited[node] = True
            component[node] = current
            for v in adj[node ^ 1]:
                if not visited[v ^ 1]:
                    stack.append(v ^ 1)
    order.reverse()
    for u in order:
        if not visited[u]:
            reverse_dfs(u, current)
            current += 1
    possible = True
    for i in range(N):
        if component[2 * i] == component[2 * i + 1]:
            possible = False
            break
    print("Yes" if possible else "No")
if __name__ == "__main__":
    main()
            
            
            
        
            
lam6er