ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

HDOJ 5726

2021-04-13 19:57:10  阅读:162  来源: 互联网

标签:... gcd ll 5726 cin mid ff HDOJ


题意

给你一个数组,询问 [ l , r ] [l,r] [l,r]之间所有数的 gcd ⁡ \gcd gcd以及所有等于这个数的区间数。

题解

区间 gcd ⁡ \gcd gcd可以用线段树和ST表解决,而所有区间gcd等于某个数的个数则需要求解一番。首先我们可以确定,数越多,得出来的gcd肯定会越小,即 gcd ⁡ ( a 1 , a 2 , . . . , a i ) ≤ gcd ⁡ ( a 1 , a 2 , . . . , a i , a i + 1 ) \gcd(a_1,a_2,...,a_i)\le\gcd(a_1,a_2,...,a_i,a_{i+1}) gcd(a1​,a2​,...,ai​)≤gcd(a1​,a2​,...,ai​,ai+1​),也就是说,gcd的前缀和是单调递减的,利用这个性质,可以在 n l o g n nlogn nlogn的时间内预处理出所有g的区间个数。

AC代码:

#include <bits/stdc++.h>
#define IO ios::sync_with_stdio(0)
#define _ff(i, a, b) for (int i = a; i <= b; ++i)
#define _f(i, a, b) for (int i = a; i < b; ++i)
using namespace std;
typedef long long ll;

const int N = 1e5 + 5;
ll a[N], f[N][30], n;

map<ll, ll> mp;

void getST() {
	_ff(i, 1, n) f[i][0] = a[i];
	_ff(j, 1, 30) _ff(i, 1, n) {
		if (i + (1<<j) - 1 <= n) f[i][j] = __gcd(f[i][j - 1], f[i + (1<<(j - 1))][j - 1]);
		else break;
	}
}

ll query(int l, int r) {
	ll k = (ll)log2(1.0 * (r - l + 1));
	return __gcd(f[l][k], f[r - (1<<k) + 1][k]);
}

void getMp() {
	mp.clear();
	_ff(i, 1, n) {
		ll g = a[i], j = i;
		while (j <= n) {
			ll l = j, r = n;
			while (l < r) {
				ll mid = (l + r + 1) >> 1;
				if (query(l, mid) == g) l = mid;
				else r = mid - 1;
			}
			mp[g] += l - j + 1;
			j = l + 1;
			g = query(i, j);
		}
	}
}

void solve() {
	cin >> n;
	_ff(i, 1, n) cin >> a[i];
	getST();
	getMp();
	int q, l, r; cin >> q;
	while (q--) {
		cin >> l >> r;
		ll g = query(l, r);
		cout << g << " " << mp[g] << endl;
	}
}

int main() {
	IO;
	int T; cin >> T;
	_ff(i, 1, T) {
		cout << "Case #" << i << ":\n";
		solve();
	}
}

标签:...,gcd,ll,5726,cin,mid,ff,HDOJ
来源: https://blog.csdn.net/weixin_45563175/article/details/115676772

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有