P1890gcd区间

原创 2018年04月17日 20:58:19

题目描述

给定一行n个正整数a[1]..a[n]。

m次询问,每次询问给定一个区间[L,R],输出a[L]..a[R]的最大公因数。

输入输出格式

输入格式:

第一行两个整数n,m。

第二行n个整数表示a[1]..a[n]。

以下m行,每行2个整数表示询问区间的左右端点。

保证输入数据合法。

输出格式:

共m行,每行表示一个询问的答案。

输入输出样例

输入样例#1:
5 3
4 12 3 6 7
1 3
2 3
5 5
输出样例#1:
1
3
7

做到一道很巧妙的题,来写一下这其实可以用DP做,用f[i][j]表示i~j的最大公约数,f[i][j]=gcd(f[i][i],f[i+1][j])

f[i][i]的值就是读入的数,所以f[i][j]可以认为是由f[i+1][j]推得的,所以要从后往前推

见代码

#include<bits/stdc++.h>
#define N 1010
using namespace std;
int n,m,f[N][N];
int main(){
	scanf("%d%d",&n,&m);
	for(int i=1;i<=n;i++)
		scanf("%d",&f[i][i]);//读入即为f[i][i]
	for(int i=n-1;i>=1;i--){
		for(int j=i+1;j<=n;j++){
			f[i][j]=__gcd(f[i][i],f[i+1][j]);
		}
	}
	int l,r;
	while(m--){
		scanf("%d%d",&l,&r);
		printf("%d\n",f[l][r]);
	}
}

收藏助手
不良信息举报
您举报文章:P1890gcd区间
举报原因:
原因补充:

(最多只允许输入30个字)