【11.9校内测试】【倒计时1天】【ak欢乐赛】【多项式计算模拟】

时间:2023-03-08 20:11:13

然而AK失败了,就是因为这道摸你题:(最后一篇题解了吧?QAQ)

【11.9校内测试】【倒计时1天】【ak欢乐赛】【多项式计算模拟】

【11.9校内测试】【倒计时1天】【ak欢乐赛】【多项式计算模拟】

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 ; if(t == '*') return ; return ; } char s[], q[];
int tp, tp1, i; struct Node {
int v[];
int siz;
Node operator + (const Node &a) const {
Node c;
memset(c.v, , sizeof(c.v));
c.siz = max(siz, a.siz);
for(int i = ; i <= c.siz; i ++) c.v[i] = (v[i] + a.v[i]) % mod;
while(c.siz && c.v[c.siz] == ) c.siz --;
return c;
}
Node operator - (const Node &a) const {
Node c;
memset(c.v, , sizeof(c.v));
c.siz = max(siz, a.siz);
for(int i = ; i <= c.siz; i ++) c.v[i] = ((v[i] - a.v[i]) % mod + mod) % mod;
while(c.siz && c.v[c.siz] == ) c.siz --;
return c;
}
Node operator * (const Node &a) const {
Node c;
memset(c.v, , sizeof(c.v));
c.siz = siz + a.siz;
for(int i = ; i <= siz; i ++)
for(int j = ; 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] == ) c.siz --;
return c;
}
} q1[], zero; Node read() {
Node nd = zero;
if(s[i] == 'x') {
nd.siz = ;
nd.v[] = ;
i ++;
return nd;
} else {
int now = ;
while(isdigit(s[i])) now = now * + s[i] - '', i ++;
nd.v[] = 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) >= ) {
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 + ); int len = strlen(s + );
s[] = '(', s[++len] = ')';
while(i <= len) {
if(pd(s[i])) q1[++tp1] = read();
else push_char(s[i ++]);
}
printf("%d\n", q1[].siz);
for(int i = ; i <= q1[].siz; i ++) printf("%d\n", q1[].v[i]);
}