結果
問題 | No.308 素数は通れません |
ユーザー |
![]() |
提出日時 | 2015-12-01 00:46:35 |
言語 | Python2 (2.7.18) |
結果 |
AC
|
実行時間 | 16 ms / 1,000 ms |
コード長 | 951 bytes |
コンパイル時間 | 829 ms |
コンパイル使用メモリ | 6,912 KB |
実行使用メモリ | 7,168 KB |
最終ジャッジ日時 | 2024-11-27 18:05:03 |
合計ジャッジ時間 | 4,308 ms |
ジャッジサーバーID (参考情報) |
judge4 / judge3 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
other | AC * 107 |
ソースコード
import sysimport mathimport randomN=input()isok=[0]*105vis=[0]*105for i in range(2,105):for j in range(2,i):if i%j==0:isok[i]=1def 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 isok[t] and vis[t]<M:vis[t]=Mq.append(t)if vis[N]==M:return 1return 0def isprime(v):d = v-1s = 0while d%2==0:s += 1d /= 2for i in range(100):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 isok[v+1]==0:continueif N%v!=1:print vbreakif isprime(N-v)==0:print vbreakelse:for M in range(2,105):if ok(N,M):print Mbreak