結果
| 問題 |
No.1097 Remainder Operation
|
| コンテスト | |
| ユーザー |
vwxyz
|
| 提出日時 | 2024-07-17 15:19:47 |
| 言語 | PyPy3 (7.3.15) |
| 結果 |
AC
|
| 実行時間 | 1,053 ms / 2,000 ms |
| コード長 | 2,334 bytes |
| コンパイル時間 | 461 ms |
| コンパイル使用メモリ | 82,704 KB |
| 実行使用メモリ | 157,696 KB |
| 最終ジャッジ日時 | 2024-07-17 15:20:01 |
| 合計ジャッジ時間 | 13,527 ms |
|
ジャッジサーバーID (参考情報) |
judge5 / judge1 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 2 |
| other | AC * 21 |
ソースコード
class Path_Doubling:
def __init__(self,N,permutation,lst=None,f=None,e=None):
self.N=N
self.permutation=permutation
self.lst=lst
self.f=f
self.e=e
def Build_Next(self,K=None):
if K==None:
K=self.N
self.k=K.bit_length()
self.permutation_doubling=[[None]*self.N for k in range(self.k)]
for n in range(self.N):
self.permutation_doubling[0][n]=self.permutation[n]
if self.lst!=None:
self.doubling=[[self.e]*self.N for k in range(self.k)]
for n in range(self.N):
self.doubling[0][n]=self.lst[n]
for k in range(1,self.k):
for n in range(self.N):
if self.permutation_doubling[k-1][n]!=None:
self.permutation_doubling[k][n]=self.permutation_doubling[k-1][self.permutation_doubling[k-1][n]]
if self.f!=None:
self.doubling[k][n]=self.f(self.doubling[k-1][n],self.doubling[k-1][self.permutation_doubling[k-1][n]])
def Permutation_Doubling(self,N,K):
if K<0 or 1<<self.k<=K:
return None
for k in range(self.k):
if K>>k&1 and N!=None:
N=self.permutation_doubling[k][N]
return N
def Doubling(self,N,K,edge=False):
if K<0:
return self.e
retu=self.e
for k in range(self.k):
if K>>k&1:
if self.permutation_doubling[k][N]==None:
return None
retu=self.f(retu,self.doubling[k][N])
N=self.permutation_doubling[k][N]
if not edge:
retu=self.f(retu,self.lst[N])
return N,retu
def Bisect(self,x,is_ok):
if not is_ok(x):
return -1,None
K=0
for k in range(self.k-1,-1,-1):
if is_ok(self.permutation_doubling[k][x]):
K|=1<<k
x=self.permutation_doubling[k][x]
return K,x
N=int(input())
A=list(map(int,input().split()))
perm=[None]*N
cnt=[None]*N
for x in range(N):
perm[x]=(x+A[x%N])%N
cnt[x]=(x+A[x%N])//N
Q=int(input())
PD=Path_Doubling(N,perm,cnt,lambda c0,c1:c0+c1,0)
PD.Build_Next(10**12)
for q in range(Q):
K=int(input())
r,c=PD.Doubling(0,K,True)
ans=r+c*N
print(ans)
vwxyz