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;
}
此生无悔入OI 来生AK IOI

浙公网安备 33010602011771号