P1890

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

很妙的一个题 可以用DP预处理
f[i][j]:i~j的gcd
状态转移方程:f[i][j]=gcd(f[i][j-1],a[j])
初始状态:f[i][i]=a[i]
而且c++自带__gcd()函数
点击查看代码
#include<bits/stdc++.h>//C++自带__gcd()! 
using namespace std;
int n,m,a[1005],f[1005][1005];
int main()
{
	ios::sync_with_stdio(false);
	cin>>n>>m;
	for(int i=1;i<=n;i++)
		cin>>a[i],f[i][i]=a[i];
	for(int i=1;i<n;i++)
		for(int j=i+1;j<=n;j++)
			f[i][j]=__gcd(f[i][j-1],a[j]);
	
	while(m--)
	{
		int l,r;
		cin>>l>>r;
		cout<<f[l][r]<<"\n";
	}
	return 0;
}
posted @ 2023-01-07 21:41  PKU_IMCOMING  阅读(7)  评论(0)    收藏  举报