#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。( )
当某次查询的区间长度为 1(即 )时,该次查询的输出一定等于 a[L]。( )
任意一次查询的输出结果一定不小于该查询区间内的最小值。( )
对于 ,数组 dp[i][j] 保存的是( )。
若把一次求最大公约数的运算视为 ,则第 17—22 行建表过程的时间复杂度为( )。
设 为一次查询的区间长度(即 ),则使得 lg[x] = 5 的 的取值范围是( )。