結果

問題 No.265 数学のテスト
ユーザー lam6er
提出日時 2025-04-15 21:45:46
言語 PyPy3
(7.3.15)
結果
RE  
実行時間 -
コード長 3,040 bytes
コンパイル時間 189 ms
コンパイル使用メモリ 82,336 KB
実行使用メモリ 101,280 KB
最終ジャッジ日時 2025-04-15 21:46:27
合計ジャッジ時間 5,466 ms
ジャッジサーバーID
(参考情報)
judge2 / judge3
このコードへのチャレンジ
(要ログイン)
ファイルパターン 結果
sample AC * 4
other AC * 31 RE * 1
権限があれば一括ダウンロードができます

ソースコード

diff #

class ConstantNode:
    def __init__(self, value):
        self.value = value

    def evaluate(self, d):
        poly = [0] * (d + 1)
        poly[0] = self.value
        return poly

class XNode:
    def evaluate(self, d):
        poly = [0] * (d + 1)
        if d >= 1:
            poly[1] = 1
        return poly

class AddNode:
    def __init__(self, left, right):
        self.left = left
        self.right = right

    def evaluate(self, d):
        a = self.left.evaluate(d)
        b = self.right.evaluate(d)
        res = [a[i] + b[i] for i in range(d + 1)]
        return res

class MultiplyNode:
    def __init__(self, left, right):
        self.left = left
        self.right = right

    def evaluate(self, d):
        a = self.left.evaluate(d)
        b = self.right.evaluate(d)
        res = [0] * (d + 1)
        for i in range(d + 1):
            for j in range(d + 1):
                if i + j <= d:
                    res[i + j] += a[i] * b[j]
        return res

class DerivativeNode:
    def __init__(self, child):
        self.child = child

    def evaluate(self, d):
        poly = self.child.evaluate(d)
        res = [0] * (d + 1)
        for i in range(1, d + 1):
            if i - 1 <= d:
                res[i - 1] = poly[i] * i
        return res

def parse_expr(s, i):
    node, i = parse_term(s, i)
    while i < len(s) and s[i] == '+':
        i += 1
        right_node, i = parse_term(s, i)
        node = AddNode(node, right_node)
    return node, i

def parse_term(s, i):
    node, i = parse_factor(s, i)
    while i < len(s) and s[i] == '*':
        i += 1
        right_node, i = parse_factor(s, i)
        node = MultiplyNode(node, right_node)
    return node, i

def parse_factor(s, i):
    if i >= len(s):
        raise ValueError("Unexpected end of string")
    if s[i] == 'd':
        i += 1
        if i >= len(s) or s[i] != '{':
            raise ValueError("Expected '{' after 'd'")
        i += 1
        start = i
        count = 1
        while i < len(s) and count != 0:
            if s[i] == '{':
                count += 1
            elif s[i] == '}':
                count -= 1
            if count == 0:
                break
            i += 1
        end = i
        i += 1  # Skip the closing '}'
        inner_str = s[start:end]
        inner_node, _ = parse_expr(inner_str, 0)
        return DerivativeNode(inner_node), i
    elif s[i].isdigit():
        val = 0
        while i < len(s) and s[i].isdigit():
            val = val * 10 + int(s[i])
            i += 1
        return ConstantNode(val), i
    elif s[i] == 'x':
        return XNode(), i + 1
    else:
        raise ValueError(f"Unexpected character: {s[i]} at position {i}")

def main():
    import sys
    input = sys.stdin.read().split()
    n = int(input[0])
    d = int(input[1])
    s = input[2]
    try:
        ast, _ = parse_expr(s, 0)
    except:
        print("0 " * (d + 1))
        return
    result = ast.evaluate(d)
    print(' '.join(map(str, result[:d+1])))

if __name__ == "__main__":
    main()
0