結果
問題 |
No.853 河原の石
|
ユーザー |
![]() |
提出日時 | 2025-05-14 12:59:08 |
言語 | PyPy3 (7.3.15) |
結果 |
WA
|
実行時間 | - |
コード長 | 3,498 bytes |
コンパイル時間 | 177 ms |
コンパイル使用メモリ | 82,408 KB |
実行使用メモリ | 60,416 KB |
最終ジャッジ日時 | 2025-05-14 13:00:21 |
合計ジャッジ時間 | 4,171 ms |
ジャッジサーバーID (参考情報) |
judge3 / judge5 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 2 |
other | AC * 4 WA * 53 |
ソースコード
import sys # Function to compute ceil(a / b) using integer division # ceil(a / b) = (a + b - 1) // b for positive integers b # Note: Standard Python integer division // behaves like floor. def solve(): # Read H and W from input # H: initial height of the tower (number of stones) # W: target displacement distance h, w = map(int, sys.stdin.readline().split()) # Calculate A = |W|, the absolute distance to move. # The problem is symmetric for positive and negative W. a = abs(w) # Base case: If the tower has 0 height (H=0) or the distance is 0 (W=0, so A=0), # no operations are needed. if h == 0 or a == 0: print(0) return # Initialize the total sum of operations. # We will use Python's arbitrary precision integers, which handle large numbers. total_sum = 0 # Initialize the current stone layer index 'k'. We iterate k from 1 to H. # The cost formula derived is Sum_{k=1 to H} ceil(A / k). # We compute this sum efficiently using blocks. k = 1 # Iterate while k is within the valid range [1, H]. while k <= h: # Calculate the value q = ceil(A / k) for the current k. # Using integer arithmetic: q = (A + k - 1) // k q = (a + k - 1) // k # The value q = ceil(A / k) is non-increasing as k increases. # Optimization: If q becomes 1, it means for all subsequent k' (from k to H), # ceil(A / k') will also be 1 (since A/k' <= A/k <= 1 if A/k <= 1). # So, we can add the remaining count (H - k + 1) * 1 to the sum and terminate early. if q == 1: total_sum += (h - k + 1) break # If q > 1, we are in a block where the value ceil(A / k') is q. # We need to find the largest k' in [k, H] such that ceil(A / k') = q. # This condition is equivalent to q-1 < A/k' <= q. # From A/k' > q-1, we get k' < A / (q - 1). # The largest integer k' satisfying this is floor((A - 1) / (q - 1)). # Calculate the theoretical end of the block where the value is q. # Note: This assumes q > 1, which is true in this branch. k_end_calc = (a - 1) // (q - 1) # The actual end of the block is limited by the maximum height H. k_end = min(h, k_end_calc) # Calculate the number of terms (k values) in the current block [k, k_end]. # Need to ensure k_end >= k. This should hold because q = ceil(A/k) implies # A/k <= q, and k_end_calc is derived from the condition related to q-1. # If k_end calculated is less than k, there might be an edge case or error. # However, for positive A and k, this calculation method is standard and generally robust. if k_end < k: # This state should not be reached with correct logic. # If it occurs, break to prevent infinite loop or incorrect results. break num_terms = k_end - k + 1 # Add the contribution of this block to the total sum: value * number_of_terms total_sum += q * num_terms # Move k to the start of the next block. k = k_end + 1 # Print the final calculated minimum number of operations. # The result needs to be followed by a newline, which print() does by default. print(total_sum) # Call the solve function to execute the solution logic. solve()