結果
問題 | No.308 素数は通れません |
ユーザー |
|
提出日時 | 2021-09-21 22:16:26 |
言語 | Python3 (3.13.1 + numpy 2.2.1 + scipy 1.14.1) |
結果 |
AC
|
実行時間 | 36 ms / 1,000 ms |
コード長 | 1,483 bytes |
コンパイル時間 | 112 ms |
コンパイル使用メモリ | 12,928 KB |
実行使用メモリ | 11,520 KB |
最終ジャッジ日時 | 2024-07-04 07:17:42 |
合計ジャッジ時間 | 5,952 ms |
ジャッジサーバーID (参考情報) |
judge2 / judge4 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
other | AC * 107 |
ソースコード
from collections import dequeimport randomprime=[1]*1000prime[0]=0prime[1]=0for i in range(2,1000):if prime[i]==0:continuej=i+iwhile j<1000:prime[j]=0j+=iN=int(input())dx=[1,0,-1,0]dy=[0,1,0,-1]def solvenaive(W):#幅Wに対して愚直にH=(N+W-1)//Wque=deque()que.append(0)dist=[0]*Ndist[0]=1while que:now=que.popleft()x=now//Wy=now%Wfor i in range(4):nx=x+dx[i]ny=y+dy[i]if(nx<0 or ny<0 or nx>=H or ny>=W):continueif nx*W+ny>N-1:continueif prime[nx*W+ny+1]:continueif dist[nx*W+ny]:continuedist[nx*W+ny]=1que.append(nx*W+ny)return dist[N-1]if N<=500:for i in range(1,N+1):if solvenaive(i):print(i)exit()def is_prime(n):if n == 2: return Trueif n == 1 or n & 1 == 0: return Falsed = (n - 1) >> 1while d & 1 == 0:d >>= 1for k in range(100):a = random.randint(1, n - 1)t = dy = pow(a, t, n)while t != n - 1 and y != 1 and y != n - 1:y = (y * y) % nt <<= 1if y != n - 1 and t & 1 == 0:return Falsereturn Trueif not N%8==1:print(8)else:if not is_prime(N-8):print(8)else:print(14)