1. 程式人生 > >洛谷 P1890 gcd區間

洛谷 P1890 gcd區間

玄學之門

題目:

傳送門

分析:

首先想到暴力,但瞅到nn最大是10001000mm最大是10000001000000,而暴力的時間複雜度為O(nmgcd())O(nm*gcd(複雜度)) 所以我們想到了dpdp: 設fi,jf_{i,j}為區間iijj的最大公約數,方程為: fi,j=gcd(fi,i,f[i+1][j])f_{i,j}=gcd(f_{i,i},f[i+1][j]) 初始化為:fi,if_{i,i}為第ii個數

程式碼:

#include<iostream>
#include<cstdio> #include<cmath> #include<cstring> #include<cstdlib> #include<algorithm> #include<set> #include<queue> #include<vector> #include<map> #include<list> #include<ctime> #include<iomanip> #include<string> #include
<bitset>
#include<deque> #include<set> #define LL long long using namespace std; inline LL read() { LL d=0,f=1;char s=getchar(); while(s<'0'||s>'9'){if(s=='-')f=-1;s=getchar();} while(s>='0'&&s<='9'){d=d*10+s-'0';s=getchar();} return d*f; } int f[1005][
1005]; int main() { int n=read(),q=read(); for(int i=1;i<=n;i++) f[i][i]=read(); for(int i=n-1;i;i--) for(int j=i+1;j<=n;j++) f[i][j]=__gcd(f[i][i],f[i+1][j]); while(q--) {int a=read(),b=read();printf("%d\n",f[a][b]);} return 0; }