T1bomb
T2 count
T3cut
T4 轮换排列
T5小木棍
T6盒子游戏
#include <bits/stdc++.h> using ll = long long; using namespace std; const int M = 2500; ll n, m; ll mx, ans = 1; ll c2(ll l, ll num, ll d) { ll r = l + (num - 1) * d; return (l + r) * num / 2; } ll order[M]; ll calc(ll k) { ll ret = 0; order[0] = k; ll now = k; for (int i = 1; i < k; i++) { order[i] = (now + k - n % k) % k; now = (now + k - n % k) % k; } ll r = 1; for (int id = 0; id < k; id++) { ll fir = order[id]; ll cnt = (n - fir) / k + 1; ll cnt2 = cnt; ll L = 0, R = n, c = n; while (L <= R) { ll mid = (L + R) >> 1; ll p1 = r + mid; ll p2 = fir + mid * k; if (p2 > n) R = mid - 1; else if (p2 <= p1) L = mid + 1; else c = mid, R = mid - 1; } if (c != n) { cnt -= c; ret += c2(fir + c * k, cnt, k); } r += cnt2; } return ret; } int main() { int T; scanf("%d", &T); while (T--) { scanf("%d%d", &n, &m); ans = 1, mx = 0; for (int k = 2; k <= min(n, m); k++) { if (__gcd(k * 1ll, n) == 1) { ll res = calc(k); if (res > mx) mx = res, ans = k; } else if (n % k == 0) { ll res = c2(k, n / k, k); if (res > mx) mx = res, ans = k; } } cout << ans << "\n"; } return 0; }