結果
問題 |
No.3046 White Tiger vs Monster
|
ユーザー |
![]() |
提出日時 | 2025-05-14 12:59:49 |
言語 | PyPy3 (7.3.15) |
結果 |
RE
|
実行時間 | - |
コード長 | 2,596 bytes |
コンパイル時間 | 177 ms |
コンパイル使用メモリ | 82,652 KB |
実行使用メモリ | 67,596 KB |
最終ジャッジ日時 | 2025-05-14 13:01:10 |
合計ジャッジ時間 | 7,504 ms |
ジャッジサーバーID (参考情報) |
judge5 / judge1 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | RE * 3 |
other | RE * 80 |
ソースコード
# -*- coding: utf-8 -*- import sys def solve(): # Read K, the total number of steps in the staircase. K = int(sys.stdin.readline()) # Read N, the number of possible step sizes. N = int(sys.stdin.readline()) # Read the N possible step sizes x_1, x_2, ..., x_N. # The input format guarantees x_i are sorted and positive. x = list(map(int, sys.stdin.readline().split())) # Define the modulus. MOD = 1000000007 # Handle the base case K=0. There is one way to reach step 0 (by doing nothing). if K == 0: print(1) return # Initialize DP table. dp[k] will store the number of ways to reach step k. # The size is K+1 to store values for steps 0 through K. dp = [0] * (K + 1) # Base case: There is 1 way to be at step 0 (the starting point). dp[0] = 1 # Filter the step sizes to keep only those that are relevant (<= K). # Since the input array x is sorted, we can stop iterating early. active_steps = [] for val in x: # We only consider steps that are positive and not larger than K. # Input guarantees x_i >= 1. if val <= K: active_steps.append(val) else: # Since x is sorted, any remaining steps will also be > K. break # If there are no possible steps (e.g., N=0 or all x_i > K), # and K > 0, then it's impossible to reach step K. if not active_steps: # dp[K] is already initialized to 0. print(0) return # Fill the DP table iteratively. # Calculate dp[k] for k from 1 to K. for k in range(1, K + 1): current_sum = 0 # To reach step k, we could have taken a final step of size `step` # from a previous step `k - step`. # Iterate through all possible active step sizes. for step in active_steps: # Check if the previous step `k - step` is valid (non-negative). # This is equivalent to checking if `step <= k`. if step <= k: # Add the number of ways to reach step `k - step`. current_sum = (current_sum + dp[k - step]) % MOD else: # Since `active_steps` is sorted, if the current `step` is already > k, # all subsequent steps will also be > k. We can stop checking for this k. break # Store the total number of ways to reach step k. dp[k] = current_sum # The final answer is the number of ways to reach step K. print(dp[K]) # Execute the solve function solve()