【11.9校内测试】【倒计时1天】【ak欢乐赛】【多项式计算模拟】
然而AK失败了,就是因为这道摸你题:(最后一篇题解了吧?QAQ)
Solution
模拟多项式乘法,其中的运算处理很像高精度,不过第$i$位代表的就是$x^i$前面的系数了。
好像去年的时候就讲了表达式的计算(又开始玻璃心了QAQ),开双栈,一个栈表示数字,一个栈表示运算符。然后碰到右括号或者运算级低就弹栈。这里只是把数字的栈变成了多项式的栈而已QAQ
然后该怎么搞就怎么搞,虽然下面的代码并没有处理符号前驱的问题,然而数据中没有出。
作为纪念的摸你题了QAQ
Code
#include<bits/stdc++.h> #define mod 10007 using namespace std; bool pd(char t) { return isdigit(t) || t == 'x'; } int level(char t) { if(t == '+' || t == '-') return 1; if(t == '*') return 2; return 0; } char s[1005], q[1005]; int tp, tp1, i; struct Node { int v[1005]; int siz; Node operator + (const Node &a) const { Node c; memset(c.v, 0, sizeof(c.v)); c.siz = max(siz, a.siz); for(int i = 0; i <= c.siz; i ++) c.v[i] = (v[i] + a.v[i]) % mod; while(c.siz && c.v[c.siz] == 0) c.siz --; return c; } Node operator - (const Node &a) const { Node c; memset(c.v, 0, sizeof(c.v)); c.siz = max(siz, a.siz); for(int i = 0; i <= c.siz; i ++) c.v[i] = ((v[i] - a.v[i]) % mod + mod) % mod; while(c.siz && c.v[c.siz] == 0) c.siz --; return c; } Node operator * (const Node &a) const { Node c; memset(c.v, 0, sizeof(c.v)); c.siz = siz + a.siz; for(int i = 0; i <= siz; i ++) for(int j = 0; j <= a.siz; j ++) c.v[i + j] = (c.v[i + j] + v[i] * a.v[j] % mod) % mod; while(c.siz && c.v[c.siz] == 0) c.siz --; return c; } } q1[1005], zero; Node read() { Node nd = zero; if(s[i] == 'x') { nd.siz = 1; nd.v[1] = 1; i ++; return nd; } else { int now = 0; while(isdigit(s[i])) now = now * 10 + s[i] - '0', i ++; nd.v[0] = now; return nd; } } void cal() { Node b = q1[tp1 --], a = q1[tp1 --]; char t = q[tp --]; if(t == '*') q1[++tp1] = a * b; else if(t == '+') q1[++tp1] = a + b; else if(t == '-') q1[++tp1] = a - b; } void push_char(char t) { if(level(t) >= 1) { while(tp && level(t) <= level(q[tp])) cal(); q[++tp] = t; } else if(t == '(') q[++tp] = t; else { while(q[tp] != '(') cal(); tp --; } } int main() { freopen("simplify.in", "r", stdin); freopen("simplify.out", "w", stdout); scanf("%s", s + 1); int len = strlen(s + 1); s[0] = '(', s[++len] = ')'; while(i <= len) { if(pd(s[i])) q1[++tp1] = read(); else push_char(s[i ++]); } printf("%d\n", q1[1].siz); for(int i = 0; i <= q1[1].siz; i ++) printf("%d\n", q1[1].v[i]); }