1. 程式人生 > >【11.9校內測試】【倒計時1天】【ak歡樂賽】【多項式計算模擬】

【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]); }