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

 

posted @ 2018-11-09 15:15  Wans_ovo  阅读(239)  评论(0编辑  收藏  举报