/* -*- coding: utf-8 -*- * * 265.cc: No.265 数学のテスト - yukicoder */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include using namespace std; /* constant */ const int MAX_D = 10; /* typedef */ typedef long long ll; typedef vector vl; struct Func { int d; ll as[MAX_D + 1]; Func() {} Func(int _d): d(_d) { memset(as, 0, sizeof(as)); } Func(int _d, ll _k): d(_d) { memset(as, 0, sizeof(as)); as[0] = _k; } void plus(const Func &f) { for (int i = 0; i <= d; i++) as[i] += f.as[i]; } void mul(ll k) { for (int i = 0; i <= d; i++) as[i] *= k; } void mul_x() { for (int i = d; i >= 0; i--) as[i + 1] = as[i]; as[0] = 0; } void diff() { for (int i = 1; i <= d; i++) as[i - 1] = i * as[i]; as[d] = 0; } void print() { for (int i = 0; i <= d; i++) { if (i > 0) putchar(' '); printf("%lld", as[i]); } putchar('\n'); } }; /* global variables */ /* subroutines */ Func expr(string &s, int &pos, int d); ll num(string &s, int &pos) { ll r = 0; while (pos < s.size() && s[pos] >= '0' && s[pos] <= '9') r = r * 10 + s[pos++] - '0'; return r; } Func term(string &s, int &pos, int d) { if (s[pos] == 'd') { pos += 2; // 'd{' Func t0 = expr(s, pos, d); pos++; // '}' t0.diff(); return t0; } Func t0(d, 1); if (s[pos] == 'x') t0.mul_x(), pos++; else t0.mul(num(s, pos)); while (pos < s.size() && s[pos] == '*') { pos++; // '*' if (s[pos] == 'x') t0.mul_x(), pos++; else t0.mul(num(s, pos)); } return t0; } Func expr(string &s, int &pos, int d) { Func e0 = term(s, pos, d); while (pos < s.size() && s[pos] == '+') { pos++; // '+' Func e1 = term(s, pos, d); e0.plus(e1); } return e0; } /* main */ int main() { int n, d; string s; cin >> n >> d >> s; int pos = 0; Func e = expr(s, pos, d); e.print(); return 0; }