結果

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

ソースコード

diff #

class Node:
    def evaluate(self, d):
        pass

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

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

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

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

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

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

    def evaluate(self, d):
        left_coeff = self.left.evaluate(d)
        right_coeff = self.right.evaluate(d)
        result = [0] * (d + 1)
        for a in range(d + 1):
            if left_coeff[a] == 0:
                continue
            for b in range(d + 1):
                if right_coeff[b] == 0:
                    continue
                if a + b <= d:
                    result[a + b] += left_coeff[a] * right_coeff[b]
        return result

class DerivNode(Node):
    def __init__(self, child):
        self.child = child

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

def parse_expression(s, pos=0):
    node, pos = parse_term(s, pos)
    while pos < len(s) and s[pos] == '+':
        pos += 1
        next_node, pos = parse_term(s, pos)
        node = AddNode(node, next_node)
    return node, pos

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

def parse_factor(s, pos):
    if pos < len(s) and s[pos] == 'd' and pos + 1 < len(s) and s[pos + 1] == '{':
        pos += 2
        child, pos = parse_expression(s, pos)
        if pos >= len(s) or s[pos] != '}':
            raise ValueError("Missing closing brace")
        pos += 1
        return DerivNode(child), pos
    else:
        return parse_primary(s, pos)

def parse_primary(s, pos):
    if pos >= len(s):
        raise ValueError("Unexpected end of input")
    c = s[pos]
    if c == 'x':
        return XNode(), pos + 1
    elif c.isdigit():
        val = int(c)
        return ConstantNode(val), pos + 1
    else:
        raise ValueError(f"Unexpected character {c} at position {pos}")

# Read input
n = int(input())
d = int(input())
s = input().strip()

# Parse the expression
ast, pos = parse_expression(s, 0)
if pos != len(s):
    raise ValueError("Invalid input")

# Evaluate and output
result = ast.evaluate(d)
print(' '.join(map(str, result)))
0