P1890 gcd区间
链接:Miku
----------------------
一道非常水的静态区间查询的问题。
----------------------
为什么说他水呢,在洛谷上的数据实在太弱,直接n^2暴力预处理都行
----------------------
然而我是不会那么干的,我选择了st表
在这道题中,只要加上一个gcd函数,然后把转移的和询问的方式改成两个区间gcd的方式就可以了
-------------------
#include<iostream> #include<cstdio> #include<algorithm> #include<cmath> using namespace std; int st[100005][30]; int n,m; int x,y; int gcd(int x,int y){ if(y==0) return x; return gcd(y,x%y); } int main(){ scanf("%d%d",&n,&m); for(int i=1;i<=n;++i) scanf("%d",&st[i][0]); for(int i=1;i<=22;++i){ for(int j=1;j+(1<<i)-1<=n;++j){ st[j][i]=gcd(st[j][i-1],st[j+(1<<(i-1))][i-1]); } } for(int i=1;i<=m;++i){ scanf("%d%d",&x,&y); int k=log2(y-x+1); cout<<gcd(st[x][k],st[y-(1<<k)+1][k])<<endl; } return 0; }