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;
}
Ac

 

posted @ 2020-02-22 08:14  Simex  阅读(198)  评论(0编辑  收藏  举报