RMQ求任意连续区间的最大公约数

版权声明:转载注明下出处就行了。 https://blog.csdn.net/LJD201724114126/article/details/89318824

前要:给出一个序列,q个询问,每次询问 l,r,求出区间 [l,r] 的最大公约数

打个ST表就好了。

#include<bits/stdc++.h>

using namespace std;


const int maxn=100010;
int gcd(int a,int b)
{
    if(!b) return a;
    else return gcd(b,a%b);
}

///dp[i][j] 表示从位置i开始,j个元素的最大公约数
int dp[maxn][20],a[maxn];
int len[maxn];

int query(int l,int r)
{
    int k=len[r-l+1];

    return gcd(dp[l][k],dp[r-(1<<k)+1][k]);

}

int main()
{

    ///ST表预处理 2^len[i]=i
    len[0]=1;

    for(int i=2;i<maxn-2;i++)
        len[i]=len[i/2]+1;

    int n;
    scanf("%d",&n);

    for(int i=1;i<=n;i++)
        scanf("%d",a+i),dp[i][0]=a[i];

    for(int j=1;j<=len[n];j++)
    {
        for(int i=1;i<=n;i++)
        {
            dp[i][j]=gcd(dp[i][j-1],dp[i+(1<<j-1)][j-1]);
        }
    }

    int ncase;
    scanf("%d",&ncase);

    while(ncase--)
    {
        int l,r;
        scanf("%d%d",&l,&r);

        printf("%d\n",query(l,r));
    }






    return 0;
}

猜你喜欢

转载自blog.csdn.net/LJD201724114126/article/details/89318824