結果
問題 | No.265 数学のテスト |
ユーザー |
![]() |
提出日時 | 2025-06-12 21:38:00 |
言語 | PyPy3 (7.3.15) |
結果 |
TLE
|
実行時間 | - |
コード長 | 3,519 bytes |
コンパイル時間 | 166 ms |
コンパイル使用メモリ | 82,348 KB |
実行使用メモリ | 287,840 KB |
最終ジャッジ日時 | 2025-06-12 21:41:25 |
合計ジャッジ時間 | 6,583 ms |
ジャッジサーバーID (参考情報) |
judge4 / judge3 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | -- * 4 |
other | TLE * 1 -- * 31 |
ソースコード
def find_matching_brace(s, pos): stack = [] for i in range(pos, len(s)): if s[i] == '{': stack.append(i) elif s[i] == '}': if stack: start = stack.pop() if not stack: return (start, i) return None def extract_plus_terms(s): terms = [] stack = [] current = [] i = 0 while i < len(s): c = s[i] if c == '+': if not stack: terms.append(''.join(current)) current = [] else: current.append(c) elif c == '{': stack.append('{') current.append(c) elif c == '}': stack.pop() current.append(c) else: current.append(c) i += 1 if current: terms.append(''.join(current)) return terms def compute_derivative(p): dp = [0] * (len(p) - 1) for i in range(1, len(p)): dp[i - 1] = p[i] * i return dp def add_polynomials(a, b, d_max): result = [0] * (d_max + 1) for i in range(d_max + 1): if i < len(a): result[i] += a[i] if i < len(b): result[i] += b[i] return result def multiply_polynomials(a, b, d_max): result = [0] * (d_max + 1) for i in range(len(a)): if a[i] == 0: continue for j in range(len(b)): if b[j] == 0: continue if i + j > d_max: continue result[i + j] += a[i] * b[j] return result def parse(s, d_max): terms = extract_plus_terms(s) result = [0] * (d_max + 1) for term in terms: if term.startswith('d{'): start = term.find('{') end = find_matching_brace(term, start)[1] t = term[start+1 : end] p = parse(t, d_max + 1) dp = compute_derivative(p) if len(dp) > d_max + 1: dp = dp[:d_max + 1] else: dp += [0] * (d_max + 1 - len(dp)) for i in range(d_max + 1): result[i] += dp[i] else: factors = term.split('*') poly = [0] * (d_max + 1) poly[0] = 1 for factor in factors: if factor == 'x': f_poly = [0] * (d_max + 1) f_poly[1] = 1 elif factor.isdigit(): f_poly = [0] * (d_max + 1) f_poly[0] = int(factor) else: f_poly = [0] * (d_max + 1) new_poly = [0] * (d_max + 1) for i in range(d_max + 1): if poly[i] == 0: continue for j in range(d_max + 1): if f_poly[j] == 0: continue if i + j > d_max: continue new_poly[i + j] += poly[i] * f_poly[j] poly = new_poly for i in range(d_max + 1): result[i] += poly[i] return result def main(): import sys input = sys.stdin.read().split() ptr = 0 N = int(input[ptr]) ptr += 1 d = int(input[ptr]) ptr += 1 S = input[ptr] ptr += 1 result_poly = parse(S, d) output = [] for i in range(d + 1): output.append(str(result_poly[i])) print(' '.join(output)) if __name__ == '__main__': main()