Buggy python submission (verdict: Time Limit Exceeded):
N,x=map(int,input().split())
A=[int(x) for x in input().split()]
dp=[[int(x) for x in A] for i in range(2)]

#dp[i]:k回魔法を唱えた時にA[i]を手に入れる最小の時間。
#dp=Aで初期化。その後、１〜Nまでのdp[i]はmin(dp[i-1],A[i])で順に更新されていく。
#更新前後のdpを保持するため蟻本P60に記載のある「配列の再利用」を行う。
#各回におけるsum(dp)+k*xを算出して最小値が答え。

#ans初期値は魔法を唱えず、全てを入手した数字（sum(A))
ans=sum(A)
for k in range(1,N):
  cnt=0
  for i in range(N):
    dp[(k+1)&1][i]=min(dp[k&1][i-1],A[i])
    cnt+=dp[(k+1)&1][i]
  ans=min(ans,cnt+k*x)
  
print(ans)


Fixed submission:
N,x=map(int,input().split())
A=[int(x) for x in input().split()]
dp=A[:]

#dp[i]:k回魔法を唱えた時にA[i]を手に入れる最小の時間。
#dp=Aで初期化。その後、１〜Nまでの各ステップでdp[i]はmin(dp[i],A[i-k])で順に更新されていく。
#各回におけるsum(dp)+k*xを算出して最小値が答え。

#ans初期値は魔法を唱えず、全てを入手した数字（sum(A))
ans=sum(A)
for k in range(1,N):
  for i in range(N):
    if dp[i]>A[i-k]:
      dp[i]=A[i-k]
  ans=min(ans,sum(dp)+x*k)

print(ans)

Buggy python submission (verdict: Time Limit Exceeded):
from itertools import accumulate

N,x=map(int,input().split())

A=[int(x) for x in input().split()]

m=A.index(min(A))
A=A[m:]+A[:m]
dp=[[int(x) for x in A] for i in range(2)]

#dp[i]:k回魔法を唱えた時にA[i]を手に入れる最小の時間。
#dp=Aで初期化。その後、１〜Nまでのdp[i]はmin(dp[i-1],A[i])で順に更新されていく。
#更新前後のdpを保持するため蟻本P60に記載のある「配列の再利用」を行う。
#各回におけるsum(dp)+k*xを算出して最小値が答え。

#ans初期値は魔法を唱えず、全てを入手した数字（sum(A))
ans=sum(A)
for k in range(1,N):
  cnt=dp[0][0]
  for i in range(1,N):
    dp[(k+1)&1][i]=min(dp[k&1][i-1],A[i])
    cnt+=dp[(k+1)&1][i]
  ans=min(ans,cnt+k*x)
  
print(ans)


Fixed submission:
N,x=map(int,input().split())
A=[int(x) for x in input().split()]
dp=A[:]

#dp[i]:k回魔法を唱えた時にA[i]を手に入れる最小の時間。
#dp=Aで初期化。その後、１〜Nまでの各ステップでdp[i]はmin(dp[i],A[i-k])で順に更新されていく。
#各回におけるsum(dp)+k*xを算出して最小値が答え。

#ans初期値は魔法を唱えず、全てを入手した数字（sum(A))
ans=sum(A)
for k in range(1,N):
  for i in range(N):
    if dp[i]>A[i-k]:
      dp[i]=A[i-k]
  ans=min(ans,sum(dp)+x*k)

print(ans)

Buggy python submission (verdict: Time Limit Exceeded):
from itertools import accumulate

N,x=map(int,input().split())

A=[int(x) for x in input().split()]
dp=[[float('inf') for x in range(N)] for y in range(N)]

#dp[0]=min(A)を捕まえる最短時間を調べる。
m=A.index(min(A))
A=A[m:]+A[:m]

#dp[i][j]=A[j]のスライムをi回魔法を唱えて捕まえるための最小時間。
#dp[0][0]=A[0],dp[0][1]=A[1],dp[0][2]=A[2]...で初期化。
for i in range(N):
  dp[0][i]=A[i]

#dp[1][1]=min(A[1],dp[0][0]),dp[1][2]=min(A[2],dp[0][1])...
#dp[i][j]=min(A[i],dp[i-1][j-1])
#最終的には回数ごとのsum+k*xの最小値が答え。
for i in range(1,N):
  for j in range(N):
    dp[i][j]=min(A[j],dp[i-1][j-1])

dp = [list(accumulate(x)) for x in dp]

ans=float('inf')
for i in range(N):
  ans=min(ans,dp[i][N-1]+i*x)

print(ans)

Fixed submission:
N,x=map(int,input().split())
A=[int(x) for x in input().split()]
dp=A[:]

#dp[i]:k回魔法を唱えた時にA[i]を手に入れる最小の時間。
#dp=Aで初期化。その後、１〜Nまでの各ステップでdp[i]はmin(dp[i],A[i-k])で順に更新されていく。
#各回におけるsum(dp)+k*xを算出して最小値が答え。

#ans初期値は魔法を唱えず、全てを入手した数字（sum(A))
ans=sum(A)
for k in range(1,N):
  for i in range(N):
    if dp[i]>A[i-k]:
      dp[i]=A[i-k]
  ans=min(ans,sum(dp)+x*k)

print(ans)

Buggy python submission (verdict: Time Limit Exceeded):
N,x=map(int,input().split())

A=[int(x) for x in input().split()]
dp=[[float('inf') for x in range(N)] for y in range(N)]

#dp[0]=min(A)を捕まえる最短時間を調べる。
m=A.index(min(A))
A=A[m:]+A[:m]

#dp[i][j]=A[j]のスライムをi回魔法を唱えて捕まえるための最小時間。
#dp[0][0]=A[0],dp[0][1]=A[1],dp[0][2]=A[2]...で初期化。
for i in range(N):
  dp[0][i]=A[i]

#dp[1][1]=min(A[1],dp[0][0]),dp[1][2]=min(A[2],dp[0][1])...
#dp[i][j]=min(A[i],dp[i-1][j-1])
#最終的には回数ごとのsum+k*xの最小値が答え。
for i in range(1,N):
  for j in range(N):
    dp[i][j]=min(A[j],dp[i-1][j-1])

ans=float('inf')
for i in range(N):
  ans=min(ans,sum(dp[i])+i*x)

print(ans)

Fixed submission:
N,x=map(int,input().split())
A=[int(x) for x in input().split()]
dp=A[:]

#dp[i]:k回魔法を唱えた時にA[i]を手に入れる最小の時間。
#dp=Aで初期化。その後、１〜Nまでの各ステップでdp[i]はmin(dp[i],A[i-k])で順に更新されていく。
#各回におけるsum(dp)+k*xを算出して最小値が答え。

#ans初期値は魔法を唱えず、全てを入手した数字（sum(A))
ans=sum(A)
for k in range(1,N):
  for i in range(N):
    if dp[i]>A[i-k]:
      dp[i]=A[i-k]
  ans=min(ans,sum(dp)+x*k)

print(ans)