module main; // https://mayokoex.hatenablog.com/entry/2015/08/08/000703 より // 多項式、微分、構文解析 import std; int d; long[] expression(ref char* begin) { auto ret = new long[](d + 1); while (true) { if (*begin == 'd') { begin += 2; auto x = expression(begin); foreach (i; 1 .. d + 1) ret[i - 1] = x[i] * i; begin++; } else if (*begin == 'x' || isDigit(*begin)) { auto x = term(begin); ret[] += x[]; } else if (*begin == '+') { begin++; auto x = expression(begin); ret[] += x[]; } else break; } return ret; } long[] term(ref char* begin) { long c = 1; int degree = 0; while (true) { if (*begin == 'x') degree++; else if (*begin == '*') {} else if (isDigit(*begin)) c *= (*begin - '0'); else break; begin++; } auto ret = new long[](d + 1); ret[degree] += c; return ret; } void main() { // 入力 int N = readln.chomp.to!int; d = readln.chomp.to!int; auto S = readln.chomp.dup; // 答えの計算 char* begin = S.ptr; auto ans = expression(begin); // 答えの出力 writefln("%(%d %)", ans); }