B.rmtcg
原题链接:rmtcg - 核桃OJ
代码这不就来了吗?
cpp
#include <bits/stdc++.h>
using namespace std;
const int N = 300005, V = 1000005, pi = 79498 + 5; //N是输入的空间大小,V是值域,pi是1~1e6的质数个数
unsigned bit_width(unsigned x){
return x == 0 ? 0 : floor(log2(x)) + 1;
}
int n, m, a[N], st[21][N];
vector<int> d[V];
vector<int> pos[pi];
vector<int> primes;
vector<int> id;
int l, r, k;
int main(){
freopen("rmtcg.in", "r", stdin);
freopen("rmtcg.out", "w", stdout);
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
cin >> n >> m;
for (int i = 0; i < n; i++){
cin >> a[i];
}
int o = bit_width(n); //获取n的二进制位数
for (int i = 0; i < n; i++){
st[0][i] = a[i];
}
for (int i = 1; i < o; i++){
for (int j = 0; j + (1 << i) <= n; j++){
st[i][j] = __gcd(st[i - 1][j], st[i - 1][j + (1 << (i - 1))]);
}
}
auto rangegcd = [&](int l, int r){ //获得区间的gcd
int L = bit_width(unsigned(r - l + 1)) - 1;
return __gcd(st[L][l], st[L][r - (1 << L) + 1]);
};
// 修改开始:添加了id向量的初始化
id.resize(V); // 添加这一行来初始化id向量的大小
for (int i = 2; i < V; i++){
if (d[i].empty()){
id[i] = primes.size();
primes.push_back(i);
for (int j = i; j < V; j += i){
d[j].push_back(i);
}
}
}
for (int i = 0; i < n; i++){
for (auto p : d[a[i]])
pos[id[p]].push_back(i);
}
while (m--){
cin >> l >> r >> k;
l--; //下标从0开始,做-1
r--;
k--;
int D = rangegcd(l, r);
if (D % primes[k] == 0){
cout << (D != primes[k]) << '\n';
continue;
}
int ans = r - l + 1;
ans -= upper_bound(pos[k].begin(), pos[k].end(), r) - lower_bound(pos[k].begin(), pos[k].end(), l);
cout << ans << '\n';
}
}
官方题解代码真是漏洞百出,居然在C++14中CE。