WA#9,求助
查看原帖
WA#9,求助
173864
NaN_HQJ2007_NaN楼主2021/8/21 14:41
#include <bits/stdc++.h>
using namespace std;
const int N = 1e5 + 5;
int n, q, f[N][20];
map<int, int> ans;
int gcd(int x, int y) {
	while (y != 0) {
		int r = x % y;
		x = y;
		y = r;
	}
	return x;
}
int query(int l, int r) {
	int j = log2(r - l + 1);
	return gcd(f[l][j], f[r - (1 << j) + 1][j]);
}
int search(int i, int t, int x) {
	int l = t, r = n;
	while (r - l > 5) {
		int mid = (l + r) >> 1;
		if (query(i, mid) >= x) l = mid;
		else r = mid;
	}
	for (int k = r; k >= l; --k) {
		if (query(i, k) == x) {
			return k;
		}
	}
}
void solve(int x) {
	int l = x, r = -1, Gcd = f[x][0];
	while (1) {
		if (r == n) break;
		r = search(x, l, Gcd);
		ans[Gcd] += r - l + 1;
		Gcd = query(x, r + 1);
		l = r + 1;
	}
}
int main() {
	ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);
	cin >> n;
	for (int i = 1; i <= n; ++i) cin >> f[i][0];
	for (int j = 1; (1 << j) <= n; ++j) {
		for (int i = 1; i + (1 << j) - 1 <= n; ++i) {
			f[i][j] = gcd(f[i][j - 1], f[i + (1 << (j - 1))][j - 1]);
		}
	}
	for (int i = 1; i <= n; ++i) solve(i);
	cin >> q;
	while (q--) {
		int x;
		cin >> x;
		cout << ans[x] << endl;
	}
	return 0;
}
2021/8/21 14:41
加载中...