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;
}