gcd区间
题目描述
给定一行n个正整数a[1]…a[n]。
m次询问,每次询问给定一个区间[L,R]
,输出a[L]~a[R]
的最大公因数。
输入格式
第一行两个整数n,m。
第二行n个整数表示a[1]…a[n]。
以下m行,每行2个整数表示询问区间的左右端点。
保证输入数据合法。
输出格式
共m行,每行表示一个询问的答案。
样例 #1
样例输入 #1
5 3 4 12 3 6 7 1 3 2 3 5 5
样例输出 #1
1 3 7
提示
对于30%的数据,n <= 100, m <= 10
对于60%的数据,m <= 1000
对于100%的数据,1 <= n <= 1000,1 <= m <= 1,000,000
0 < 数字大小 <= 1,000,000,000
思路
我们看题不难发现题目是寻找 a[L]~a[R]
这片区间之内的一个最值问题。不过这题中是求区间内的最大公因数,区间!所以,要求:多次求解连续区域 a ∼ b a\sim b a∼b 的最大公因数。我们能想到什么?很明显!求区间最值问题的ST表,ST表不懂的看这里。
ST表模板
#include <iostream>
using namespace std;
typedef long long ll;
const int N = 100010;
int maxn[N][50]; //区间最大值表
int lg[N]; //lg函数,其实就是课上讲的Log[N]
inline int read(){
//快速输入
int x = 0,f=1;char ch = getchar();
while(ch < '0' || ch > '9') {
if(ch ==