cf1493 D. GCD of an Array

题意:

给定数组,每次询问 \(i,x\) 表示把 \(a_i\) 乘上 \(x\),每次询问后输出整个数组的 gcd

思路:

非常暴力的stl。map<int,int> mpa[i] 记录 \(a_i\) 的质因子分解式,multiset<int> S[p] 存所有数中 p 的次数

int p[N], pr[N], tot; map<int,int> mp[N];
void init(int n = 2e5) { //线性筛+质因子分解
    p[1] = 1;
    for(int i = 2; i <= n; i++) {
        if(!p[i]) p[i] = i, pr[++tot] = i;
        for(int j = 1; j <= tot && pr[j] <= n / i; j++) {
            p[i*pr[j]] = pr[j];
            if(p[i] == pr[j]) break;
        }
    }
    for(int i = 1; i <= n; i++) {
        int x = i; while(x > 1) {
            int d = p[x], s = 0;
            while(x % d == 0) x /= d, s++;
            mp[i][d] = s;
        }
    }
}

int n, q; ll ans = 1;
map<int,int> mpa[N];
multiset<int> S[N];

void add(int p, int s) { //p^s
    S[p].insert(s);
    if(S[p].size() == n) (ans *= qmi(p,*S[p].begin())) %= mod;
}
void del(int p, int s) { //p^s
    if(!s) return;
    if(S[p].size() == n) (ans *= inv(qmi(p,*S[p].begin()))) %= mod;
    S[p].erase(S[p].find(s));
}

void sol() {
    cin >> n >> q;
    for(int i = 1, x; i <= n; i++) {
        cin >> x;
        mpa[i] = mp[x];
        for(auto &[p,s]: mpa[i]) add(p,s);
    }

    while(q--) {
        int i, x; cin >> i >> x;
        for(auto &[p,s]: mp[x])
            del(p,mpa[i][p]), add(p,mpa[i][p]+s), mpa[i][p] += s;
        cout << ans << endl;
    }
}
posted @ 2022-05-29 01:16  Bellala  阅读(23)  评论(0)    收藏  举报