RE30pts求助!!!

5. gcd区间问题

题目ID:20632必做题100分

最新提交:

Runtime Error

0 分

历史最高:

Runtime Error

30 分

时间限制: 1000ms

空间限制: 65536kB

题目描述

给定 nn 个正整数 a1,a2,…,ana1​,a2​,…,an​。
mm 次询问,每次询问给定一个区间 [l,r][l,r],输出 al,al+1,…,aral​,al+1​,…,ar​ 的最大公因数。

输入格式

第一行两个整数 n,mn,m。
第二行 nn 个整数表示 a1,a2,…,ana1​,a2​,…,an​。
以下 mm 行,每行两个整数 l,rl,r 表示询问区间的左右端点。

输出格式

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

样例

Input 1

5 3 4 12 3 6 7 1 3 2 3 5 5

Output 1

1 3 7

数据范围

● 对于 30%30% 的数据,1≤n≤1001≤n≤100,1≤m≤101≤m≤10;
● 对于 100%100% 的数据,1≤l≤r≤n≤200001≤l≤r≤n≤20000,1≤m≤1061≤m≤106,1≤ai≤1091≤ai​≤109
代码:

#include<bits/stdc++.h>
#define int long long
using namespace std;
int n,m;
int a[1005];
int dp[1005][1005];

signed main(){
	scanf("%lld%lld",&n,&m);
	for(int i=1;i<=n;i++){
		scanf("%lld",&a[i]);
	}
	for(int i=1;i<=n;i++){
		dp[i][i]=a[i];
	}
	for(int i=n-1;i>=1;i--){
		for(int j=i+1;j<=n;j++){
			dp[i][j]=__gcd(dp[i][i],dp[i+1][j]);
		}
	}
	while(m--){
		int l,r;
		scanf("%lld%lld",&l,&r);
		cout<<dp[l][r]<<endl;
	}
	return 0;
}
/*
颠倒空格

*/