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;
}
}

浙公网安备 33010602011771号