洛谷1890 gcd区间
题目描述
给定一行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
说明
对于30%的数据,n <= 100, m <= 10
对于60%的数据,m <= 1000
对于100%的数据,1 <= n <= 1000,1 <= m <= 1,000,000
0 < 数字大小 <= 1,000,000,000
解题思路
这个题用的类似区间型DP,但是只能过8个点,求优化,求优化
1 program gcd1; 2 var 3 f:array[1..1000,1..1000] of longint; 4 n,m,i,j,l,r,p:Longint; 5 function gcd(x,y:Longint):longint; 6 begin 7 if x mod y=0 then exit(y) 8 else exit(gcd(y,x mod y)); 9 end; 10 begin 11 read(n,m); 12 for i:=1 to n do read(f[i,i]); 13 for p:=1 to n-1 do 14 for i:=1 to n-p do 15 begin 16 j:=i+P; 17 f[i,j]:=gcd(f[i,j-1],f[i+1,j]); 18 end; 19 for i:=1 to m do 20 begin 21 read(l,r); 22 writeln(f[l,r]); 23 end; 24 end.