目录
题目链接
https://www.luogu.org/problemnew/show/P1890
思路
动态规划
设
Fij
F
i
j
表示i到j之间的最大公因数
然后很容易就能得出来动态转移方程
Fij=gcd(Fij,Aj)
F
i
j
=
g
c
d
(
F
i
j
,
A
j
)
然后其实 Aj A j 就是 Fjj F j j
就变成了
Fij=gcd(Fij,Fjj)
F
i
j
=
g
c
d
(
F
i
j
,
F
j
j
)
代码
#include<cstdio>
#include<algorithm>
#define r(i,a,b) for(int i=a;i<=b;i++)
using namespace std;
int f[1001][1001],n,m,l,r;
int main()
{
scanf("%d%d",&n,&m);
r(i,1,n) scanf("%d",&f[i][i]);//输入
r(i,1,n-1)
r(j,i+1,n)
f[i][j]=__gcd(f[i][j-1],f[j][j]);//STL自带gcd
while(m--)
{
scanf("%d%d",&l,&r);
printf("%d\n",f[l][r]);//输出
}
}