區間最大值(數論分塊)
阿新 • • 發佈:2022-03-31
題意
長度為\(n\)的陣列\(a\),下標從\(1\)開始,定義\(a_i = n % i\)。
有\(m\)組詢問\(L, R\),求\(\max\limits_{i = L}^R a_i\)
資料範圍
\(n \leq 10^8\)
\(m \leq 10^4\)
\(1 \leq L \leq R \leq n\)
思路
由\(a_i = n \% i = n - \lfloor n / i \rfloor * i\),則區間最大值相當於求\(\lfloor n / i \rfloor * i\)的最小值。
而\(\lfloor n / i \rfloor\)只有\(2\sqrt n\)個不同的取值。對每個\(\lfloor n / i \rfloor\)
程式碼
#include <iostream> #include <cstdio> using namespace std; int main() { int n, m; scanf("%d%d", &n, &m); while(m --) { int a, b; scanf("%d%d", &a, &b); int ans = n - (n / a) * a; for(int l = a, r; l <= b; l = r + 1) { r = n / (n / l); ans = max(ans, n - (n / l) * l); } printf("%d\n", ans); } return 0; }