Загрузка данных


import sys

def solve():
    # Быстрое чтение входных данных
    input_data = sys.stdin.read().split()
    if not input_data:
        return
    
    n = int(input_data[0])
    s_target = int(input_data[1])
    k_limit = int(input_data[2])
    
    # Номиналы монет
    coins = list(map(int, input_data[3:]))
    
    mod = 10**9 + 7
    
    # dp[k][s] - количество способов набрать сумму s используя ровно k монет
    # Инициализируем таблицу нулями
    dp = [[0] * (s_target + 1) for _ in range(k_limit + 1)]
    
    # Базовый случай: 0 монет дают сумму 0
    dp[0][0] = 1
    
    # Порядок обхода: сначала количество монет, потом номиналы, потом суммы.
    # Это позволяет корректно учитывать "ровно K монет".
    for k in range(1, k_limit + 1):
        current_dp_k = dp[k]
        prev_dp_k = dp[k-1]
        for coin in coins:
            for s in range(coin, s_target + 1):
                # Способы получить сумму s из k монет с использованием текущей монеты
                # складываются из способов получить s-coin из k-1 монет
                current_dp_k[s] = (current_dp_k[s] + prev_dp_k[s - coin]) % mod
                
    # Результат — количество способов набрать S ровно K монетами
    print(dp[k_limit][s_target])

if __name__ == "__main__":
    solve()