Submission #1345055

#TimeUsernameProblemLanguageResultExecution timeMemory
1345055nguyenkhangninh99Slon (COCI15_slon)C++20
120 / 120
2 ms1348 KiB

#include <bits/stdc++.h>
using namespace std;

#define int long long
int p, m; 
pair<int, int> mulpair(pair<int, int> a, pair<int, int> b){
    return {(a.first * b.second + a.second * b.first) % m, (a.second * b.second) % m};
}

pair<int, int> addpair(pair<int, int> a, pair<int, int> b){
    return {(a.first + b.first) % m, (a.second + b.second) % m};
}
pair<int, int> subpair(pair<int, int> a, pair<int, int> b){
    return {(a.first - b.first + m) % m, (a.second - b.second + m) % m};
}
signed main(){
    ios_base::sync_with_stdio(false);
    cin.tie(0); cout.tie(0);

    string a; cin >> a;
    cin >> p >> m;
    
    stack<int> s;
    vector<int> pos(a.size() + 1);
    for(int i = 0; i < a.size(); i++){
        if(a[i] != '(' && a[i] != ')') continue;
        if(a[i] == '(') s.push(i);
        else{
            pos[s.top()] = i;
            pos[i] = s.top();
            s.pop();
        }
    }
    function<pair<int, int>(int, int)> solve = [&](int l, int r){
        vector<pair<int, int>> val, exp;
        vector<char> op, op2;

        for(int i = l; i <= r;){
            if(isdigit(a[i])){
                int c = 0;
                for(; i <= r && isdigit(a[i]); i++) c = (c * 10 + a[i] - '0') % m;
                val.push_back({0, c});
            }
            else if(a[i] == '('){
                val.push_back(solve(i + 1, pos[i] - 1));
                i = pos[i] + 1;
            }
            else if(a[i] == 'x') val.push_back({1, 0}), i++;
            else op.push_back(a[i++]);
        }

        exp.push_back(val.front());
        for(int i = 1; i < val.size(); i++){
            if(op[i - 1] != '*'){
                exp.push_back(val[i]);
                op2.push_back(op[i - 1]);
                continue;
            }
            exp.back() = mulpair(exp.back(), val[i]);
        }

        pair<int, int> res = exp.front();

        for(int i = 1; i < exp.size(); i++)
            if(op2[i - 1] == '+') res = addpair(res, exp[i]);
            else res = subpair(res, exp[i]);

        return res;
    };
    auto [x, y] = solve(0, a.size() - 1);
    for(int i = 0; i < m; i++){
        if((x * i + y) % m == p){
            cout << i;
            return 0;
        }
    }
}
#Verdict Execution timeMemoryGrader output
Fetching results...