๐Ÿšง This website is under construction. ๐Ÿšง
AtCoder
ABC
258
E

ABC
E
ๅ‘จๆœŸๆ€ง
ใƒ€ใƒ–ใƒชใƒณใ‚ฐ

ABC258 E - Packing Potatoes

https://atcoder.jp/contests/abc258/tasks/abc258_e (opens in a new tab)
ๆฐด่‰ฒไธŠไฝใ€‚ๅ‘จๆœŸๆ€งใ€‚ใƒ€ใƒ–ใƒชใƒณใ‚ฐใ€‚

ๅ„็ฎฑใฎใ˜ใ‚ƒใŒใ„ใ‚‚ใฎ้‡ใ•ใ‚„ๅ€‹ๆ•ฐใ‚‚ๅ‘จๆœŸ็š„ใงใฏใ‚ใ‚‹ใ‚‚ใฎใฎใ€ใ“ใ‚Œใ ใ‘ใงใฏใ˜ใ‚ƒใŒใ„ใ‚‚ใฎ็จฎ้กžใฎๅŒบๅˆฅใŒใงใใชใ„ใ€‚ 1, 7 ใจ 3, 5 ใฏๅ…ฑใซใ˜ใ‚ƒใŒใ„ใ‚‚ใฎ้‡ใ•ใฎๅ’Œใจๅ€‹ๆ•ฐใŒ็ญ‰ใ—ใ„ใŒใ€ไธญ่บซใŒๅŒบๅˆฅใงใใชใ„

ใ“ใ“ใง[* ใ€Œใ˜ใ‚ƒใŒใ„ใ‚‚ ii ใ‹ใ‚‰็ฎฑ่ฉฐใ‚ใ‚’ๅง‹ใ‚ใŸๆ™‚ใ€ๆฌกใฎ็ฎฑใฎๆœ€ๅˆใฎใ˜ใ‚ƒใŒใ„ใ‚‚ใฎ็จฎ้กž jj ใ€]ใ‚’่€ƒใˆใ‚‹ใจ่ฆ‹้€šใ—ใŒใ‚ˆใใชใ‚Šใ€ABC167 D - Teleporter (opens in a new tab) ใจๅŒใ˜่ฆ้ ˜ใง่งฃใ‘ใ‚‹ใ€‚

ๆœ€ๅˆใฎๅˆๆœŸๅŒ–ใฎ้ƒจๅˆ†ใฎ่‚ๅฟƒใงใ€ใ˜ใ‚ƒใŒใ„ใ‚‚ ii ใ‹ใ‚‰็ฎฑ่ฉฐใ‚ใ‚’ๅง‹ใ‚ใŸๆ™‚ใ€็ฎฑใŒใ„ใฃใฑใ„ใซใชใ‚‹ใฎใฏไฝ•ๅ€‹็›ฎใ‹ใจใ„ใ†่จˆ็ฎ—ใฏๆ„š็›ดใซใ‚„ใ‚‹ใจ O(NX)O(NX) ใจใชใฃใฆใ—ใพใ†๏ผˆ Wi=1W_i=1 ใฎๅ ดๅˆ๏ผ‰ใ€‚ ใใฎใŸใ‚ S=โˆ‘i=0Nโˆ’1WiS=\sum_{i=0}^{N-1}W_i ใ‚’ 1 ๅ‘จๆœŸๅˆ†ใจใ—ใฆใ€ XX ใ‚’ SS ใงๅ‰ฒใฃใŸไฝ™ใ‚Šใซๅฏพใ—ใฆไบŒๅˆ†ๆŽข็ดขใ‚’่กŒใ†ใ“ใจใง้ซ˜้€ŸใซๅˆๆœŸๅŒ–ใ‚’่กŒใ†ใ“ใจใŒใงใใ‚‹ใ€‚

ใพใŸใ€่žใ‹ใ‚Œใฆใ„ใ‚‹ใฎใฏ็ฎฑใซใ„ใ‚Œใ‚‹ใ˜ใ‚ƒใŒใ„ใ‚‚ใฎๅ€‹ๆ•ฐใชใฎใงๅˆฅ้€”ๆฑ‚ใ‚ใฆใŠใๅฟ…่ฆใŒใ‚ใ‚‹ใ€‚

import bisect
import itertools
 
n, q, x = map(int, input().split())
w = list(map(int, input().split()))
k = [int(input()) for _ in range(q)]
 
# dob[p][i] = 2^pๅ€‹็›ฎใฎ็ฎฑใซๅฏพใ—ใฆใ€i(mod N)็•ช็›ฎใฎใ˜ใ‚ƒใŒใ„ใ‚‚ใ‹ใ‚‰่ฉฐใ‚ใฆใ„ใฃใŸใจใใ€ๆฌกใฎ็ฎฑใซๅ…ฅใ‚Œใ‚‹ๆœ€ๅˆใฎใ˜ใ‚ƒใŒใ„ใ‚‚ใฎ็•ชๅท(mod N)
dob = [[0] * n for _ in range(41)]
 
# count[i] := i(mod N)็•ช็›ฎใฎใ˜ใ‚ƒใŒใ„ใ‚‚ใ‹ใ‚‰่ฉฐใ‚ใฆใ„ใๆ™‚ใ€่“‹ใ‚’ใ™ใ‚‹ใพใงใซๅ…ฅใ‚Œใ‚‹ใ˜ใ‚ƒใŒใ„ใ‚‚ใฎๅ€‹ๆ•ฐ
count = [0] * n
 
sum_w = sum(w)
acc_ww = [0] + list(itertools.accumulate(w + w))
 
for i in range(n):
    target = acc_ww[i] + x % sum_w
    index = bisect.bisect_left(acc_ww, target)
    dob[0][i] = index % n
    count[i] = index - i + x // sum_w * n
 
for p in range(40):
    for i in range(n):
        dob[p + 1][i] = dob[p][dob[p][i]]
 
for k in k:
    ans = 0
    for shift in range(40):
        if (k - 1 >> shift) & 1:
            ans = dob[shift][ans]
    print(count[ans])