2022广西师范大学暑期训练赛 E-寄CD?(ST表+二分)

E-寄CD?_2022广西师范大学暑期训练赛 (nowcoder.com)

题目描述

给你一个长度为 n 的序列 a, 接下来有 q 个 询问,

每个询问给出一个数 x, 你需要求出 gcd(al,al+1...ar)=x 的区间数量。

输入

1
5 2
1 2 3 4 5
1
2

输出

11
1

ST表+二分做法 

#include
using namespace std;
typedef long long LL;
typedef pair PII;
const int N=200200,M=2002;
map mp;
int n,q,a[N],f[N][20];
int query(int l,int r)
{
    int k=log(r-l+1)/log(2);
    return __gcd(f[l][k],f[r-(1<>T;
    while(T--)
    {
        mp.clear();
        cin>>n>>q;
        for(int i=1;i<=n;i++)
        {
            cin>>a[i];
            f[i][0]=a[i];//f[i][0]就是它本身
        }
        for(int j=1;j<=21;j++)
        {
            for(int i=1;i+(1<>x;
            cout<

 

你可能感兴趣的:(数论,算法,c++)