← 查看本卷题目
组合题6 个小题
已作答 0 / 6
#include <iostream>using namespace std;int n, m, a[100007], L, R, lg[100007], i, j, t, dp[100007][25], pw[25];int gcd(int x, int y) {    if (y == 0) return x;    return gcd(y, x % y);}int main() {    cin >> n >> m;    for (i = 1; i <= n; i++) cin >> a[i];    t = 0;    pw[0] = 1;    for (i = 1; i <= 24; i++) pw[i] = pw[i - 1] * 2;    for (i = 1; i <= 100000; i++)        if (pw[t + 1] >= i) lg[i] = t;        else { t++; lg[i] = t; }    for (i = 1; i <= n; i++) {        dp[i][0] = a[i];    }    for (j = 1; j <= lg[n]; j++) {        for (i = 1; i + pw[j] - 1 <= n; i++) {            dp[i][j] = gcd(dp[i][j - 1], dp[i + pw[j - 1]][j - 1]);        }    }    for (i = 1; i <= m; i++) {        cin >> L >> R;        cout << gcd(dp[L][lg[R - L + 1]], dp[R - pw[lg[R - L + 1]] + 1][lg[R - L + 1]]) << endl;    }    return 0;}

说明:保证 1≤n≤1000001 \le n \le 100000,每次查询满足 1≤L≤R≤n1 \le L \le R \le n,且数组 aa 的元素均为正整数。

第 23 题判断题原卷 1.5 分

当某次查询的区间长度为 1(即 L=RL=R)时,该次查询的输出一定等于 a[L]。( )

填写答案