• 【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
    ", q1[1].siz);
        for(int i = 0; i <= q1[1].siz; i ++)    printf("%d
    ", q1[1].v[i]);
    }
  • 相关阅读:
    用element-ui搭建后台框架
    给hover加上过渡效果
    vue搭建项目
    单选框的选中事件
    Javascript开发中让代码性能变高的小技巧
    这是一个弹幕
    纯CSS打造进度条
    fixed元素随滚动条无抖动滚动
    python3实现url全编码/解码
    如何入门漏洞挖掘,以及提高自己的挖掘能力(别人写的挺好)
  • 原文地址:https://www.cnblogs.com/wans-caesar-02111007/p/9935292.html
Copyright © 2020-2023  润新知