开始: 2024-05-23 00:00:00

(23-24赛季)稠州常规赛17

结束: 2024-05-27 00:00:00
当前  2025-04-16 16:56:48  类型: IOI  状态: 已经结束 

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