結果

問題 No.265 数学のテスト
ユーザー gew1fw
提出日時 2025-06-12 21:16:12
言語 PyPy3
(7.3.15)
結果
AC  
実行時間 153 ms / 2,000 ms
コード長 2,703 bytes
コンパイル時間 294 ms
コンパイル使用メモリ 82,536 KB
実行使用メモリ 77,440 KB
最終ジャッジ日時 2025-06-12 21:17:00
合計ジャッジ時間 3,701 ms
ジャッジサーバーID
(参考情報)
judge3 / judge4
このコードへのチャレンジ
(要ログイン)
ファイルパターン 結果
sample AC * 4
other AC * 32
権限があれば一括ダウンロードができます

ソースコード

diff #

class Parser:
    def __init__(self, s, d):
        self.s = s
        self.pos = 0
        self.d = d

    def parse_expression(self):
        res = self.parse_term()
        while self.pos < len(self.s) and self.s[self.pos] == '+':
            self.pos += 1
            term = self.parse_term()
            res = self.add_poly(res, term)
        return res

    def parse_term(self):
        res = self.parse_factor()
        while self.pos < len(self.s) and self.s[self.pos] == '*':
            self.pos += 1
            factor = self.parse_factor()
            res = self.multiply_poly(res, factor)
        return res

    def parse_factor(self):
        c = self.s[self.pos]
        if c == 'd':
            self.pos += 1
            if self.pos >= len(self.s) or self.s[self.pos] != '{':
                raise ValueError("Expected '{' after 'd'")
            self.pos += 1
            expr_poly = self.parse_expression()
            if self.pos >= len(self.s) or self.s[self.pos] != '}':
                raise ValueError("Expected '}' after expression")
            self.pos += 1
            return self.derivative(expr_poly)
        elif c == 'x':
            self.pos += 1
            return self.create_x_poly()
        elif c.isdigit():
            num = int(c)
            self.pos += 1
            return self.create_number_poly(num)
        else:
            raise ValueError(f"Unexpected character: {c} at pos {self.pos}")

    def add_poly(self, a, b):
        res = [0] * (self.d + 1)
        for i in range(self.d + 1):
            res[i] = a[i] + b[i]
        return res

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

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

    def create_x_poly(self):
        poly = [0] * (self.d + 1)
        if self.d >= 1:
            poly[1] = 1
        return poly

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

def main():
    import sys
    input = sys.stdin.read().split()
    n = int(input[0])
    d = int(input[1])
    s = input[2]
    parser = Parser(s, d)
    try:
        poly = parser.parse_expression()
    except:
        print("0 " * (d + 1))
        return
    print(' '.join(map(str, poly)))

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