結果
| 問題 |
No.2039 Copy and Avoid
|
| コンテスト | |
| ユーザー |
taiga0629kyopro
|
| 提出日時 | 2022-08-12 22:56:16 |
| 言語 | PyPy3 (7.3.15) |
| 結果 |
AC
|
| 実行時間 | 310 ms / 2,000 ms |
| コード長 | 1,534 bytes |
| コンパイル時間 | 152 ms |
| コンパイル使用メモリ | 82,420 KB |
| 実行使用メモリ | 77,276 KB |
| 最終ジャッジ日時 | 2024-09-23 03:36:23 |
| 合計ジャッジ時間 | 4,010 ms |
|
ジャッジサーバーID (参考情報) |
judge3 / judge2 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| other | AC * 31 |
ソースコード
####二分探索###################################
#配列は昇順にソートずみ
def bilower(a,x):
# a[i]<=x となる最大のiを返す ない時は-1
if len(a)==0:return -1
mi=0
ma=len(a)-1
if a[0]>x:return -1
if a[ma]<=x:return ma
while ma-mi>1:
mid=(ma+mi)//2
if a[mid]<=x:mi=mid
else:ma=mid
return mi
def bihigher(a,x):
# a[i]>=x となる最小のiを返す ない時は len(a)
if len(a)==0:return 0
mi=0
ma=len(a)-1
if a[ma]<x:return ma+1
if a[0]>=x:return 0
while ma-mi>1:
mid=(ma+mi)//2
if a[mid]>=x:ma=mid
else:mi=mid
return ma
def birange(a,l,r):
if l>=r:return 0
r-=1
#l<=a[i]<r となるiの個数を返す
left=bihigher(a,l)
right=bilower(a,r)
return right-left+1
################################################
n,m,a,b=map(int,input().split())
c=list(map(int,input().split()))
from _collections import defaultdict
yaku=set()
for i in range(1,n+1):
if i**2>n:break
if n%i==0:
yaku.add(i)
yaku.add(n//i)
yaku=list(yaku)
yaku.sort()
ng=defaultdict(lambda:[])
for x in yaku:
for y in c:
if y%x==0:
ng[x].append(y)
ng[x].sort()
dp=defaultdict(lambda:2**63)
dp[1]=0
for x in yaku:
if x==1:continue
for y in yaku:
if x%y!=0:continue
if birange(ng[y],1,x+1)>0:continue
cnt=1
if y==1:cnt=0
dp[x]=min(dp[x],dp[y]+a*(x-y)//y+b*cnt)
ans=dp[n]
if ans>10**18:ans=-1
print(ans)
taiga0629kyopro