結果
問題 | No.308 素数は通れません |
ユーザー |
![]() |
提出日時 | 2015-12-01 00:53:31 |
言語 | Python2 (2.7.18) |
結果 |
AC
|
実行時間 | 16 ms / 1,000 ms |
コード長 | 1,058 bytes |
コンパイル時間 | 44 ms |
コンパイル使用メモリ | 6,912 KB |
実行使用メモリ | 7,168 KB |
最終ジャッジ日時 | 2024-11-27 18:05:08 |
合計ジャッジ時間 | 3,625 ms |
ジャッジサーバーID (参考情報) |
judge3 / judge5 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
other | AC * 107 |
ソースコード
import sysimport mathimport randomN=input()def create_erato(n):div = [0]*(n+2)primes = []for i in range(2,n+1):if div[i] == 0:primes.append(i)for j in range(i,n+1,i):div[j] = ireturn (div,primes)div = create_erato(105)[0]vis=[0]*105def ok(N,M):q=[1]while len(q) > 0:v = q[-1]q.pop()for t in (v-1,v+1,v-M,v+M):if v%M==1 and t==v-1:continueif v%M==0 and t==v+1:continueif t<=0 or t>N:continueif div[t]!=t and vis[t]<M:vis[t]=Mq.append(t)if vis[N]==M:return 1return 0def MillarRabin(v,loop):d = v-1s = 0while d%2==0:s += 1d /= 2for i in range(loop):a = random.randrange(0,v-2)+1r = pow(a,d,v)if r==1 or r==v-1:continueng = 0for j in range(s):r = pow(r,2,v)if r == v-1:ng = 1if ng==0:return 0return 1if N>=100:random.seed()for v in range(8,100,2):if div[v+1]!=v+1 and (N%v!=1 or MillarRabin(N-v,100)==0):print vbreakelse:for M in range(2,105):if ok(N,M):print Mbreak