結果

問題 No.1977 Extracting at Constant Intervals
ユーザー lam6er
提出日時 2025-03-31 17:58:58
言語 PyPy3
(7.3.15)
結果
TLE  
実行時間 -
コード長 1,547 bytes
コンパイル時間 163 ms
コンパイル使用メモリ 82,184 KB
実行使用メモリ 91,880 KB
最終ジャッジ日時 2025-03-31 17:59:44
合計ジャッジ時間 7,803 ms
ジャッジサーバーID
(参考情報)
judge2 / judge4
このコードへのチャレンジ
(要ログイン)
ファイルパターン 結果
sample AC * 2
other AC * 1 TLE * 3 -- * 27
権限があれば一括ダウンロードができます

ソースコード

diff #

import sys
import math
from collections import defaultdict

def input():
    return sys.stdin.read()

def modinv(a, m):
    g, x, y = extended_gcd(a, m)
    if g != 1:
        return None  # inverse doesn't exist
    else:
        return x % m

def extended_gcd(a, b):
    if a == 0:
        return (b, 0, 1)
    else:
        g, y, x = extended_gcd(b % a, a)
        return (g, x - (b // a) * y, y)

def main():
    data = input().split()
    idx = 0
    N = int(data[idx])
    idx +=1
    M = int(data[idx])
    idx +=1
    L = int(data[idx])
    idx +=1
    A = list(map(int, data[idx:idx+N]))
    idx += N
    
    d = math.gcd(N, L)
    L_prime = L // d
    N_prime = N // d
    
    try:
        inv_N_prime = modinv(N_prime, L_prime)
    except:
        print(0)
        return
    
    groups = defaultdict(list)
    for p in range(1, N+1):
        s = p % d
        m_p = (p - s) // d
        groups[s].append( (m_p, A[p-1]) )
    
    max_sum = -float('inf')
    for s in groups:
        current_list = groups[s]
        # Iterate over all possible t in 0 to L_prime -1
        for t in range(L_prime):
            total = 0
            for (m_p, a_p) in current_list:
                c = t - m_p
                k0 = (c * inv_N_prime) % L_prime
                if k0 > M-1:
                    cnt = 0
                else:
                    cnt = ( (M-1 - k0) // L_prime ) + 1
                total += a_p * cnt
            if total > max_sum:
                max_sum = total
    print(max_sum)

if __name__ == '__main__':
    main()
0