結果
| 問題 | 
                            No.1043 直列大学
                             | 
                    
| コンテスト | |
| ユーザー | 
                             | 
                    
| 提出日時 | 2020-05-02 00:03:28 | 
| 言語 | PyPy3  (7.3.15)  | 
                    
| 結果 | 
                             
                                AC
                                 
                             
                            
                         | 
                    
| 実行時間 | 336 ms / 2,000 ms | 
| コード長 | 911 bytes | 
| コンパイル時間 | 396 ms | 
| コンパイル使用メモリ | 82,816 KB | 
| 実行使用メモリ | 118,528 KB | 
| 最終ジャッジ日時 | 2024-12-22 19:57:10 | 
| 合計ジャッジ時間 | 4,685 ms | 
| 
                            ジャッジサーバーID (参考情報)  | 
                        judge2 / judge4 | 
(要ログイン)
| ファイルパターン | 結果 | 
|---|---|
| sample | AC * 3 | 
| other | AC * 28 | 
ソースコード
import sys
from itertools import accumulate
sys.setrecursionlimit(10 ** 7)
rl = sys.stdin.readline
def solve():
    MOD = 10 ** 9 + 7
    _, _ = map(int, rl().split())
    V = list(map(int, rl().split()))
    R = list(map(int, rl().split()))
    A, B = map(int, rl().split())
    
    N, M = sum(V), sum(R)
    
    dp_v = [0] * (N + 1)
    dp_v[0] = 1
    for vi in V:
        for i in range(N - vi, -1, -1):
            if dp_v[i]:
                dp_v[i + vi] += dp_v[i]
    
    dp_r = [0] * (M + 1)
    dp_r[0] = 1
    for ri in R:
        for i in range(M - ri, -1, -1):
            if dp_r[i]:
                dp_r[i + ri] += dp_r[i]
    
    acc = list(accumulate(dp_v))
    ans = 0
    for idx, val in enumerate(dp_r[1:]):
        i = idx + 1
        if val:
            ans = (ans + (acc[min(N, B * i)] - acc[min(N, A * i - 1)]) * val) % MOD
    print(ans)
if __name__ == '__main__':
    solve()