1 条题解

  • 0
    @ 2026-4-26 15:57:22
    #include "hora.h"
    #include <assert.h>
    
    typedef long long ll;
    
    const int NMAX = 100000;
    
    ll lcm, n;
    
    int
    get(ll x, ll s)
    {
    	int r;
    	x %= n;
    	r = (x + s - 1ll) % n;
    	s = r - x + 1;
    	if (s <= 0)
    		s += n;
    
    	return 2 * ask(x, r) - s;
    }
    
    int
    gcd(int a, int b)
    {
    	while (b) {
    		b ^= a;
    		a ^= b;
    		b ^= a;
    		b %= a;
    	}
    	return a;
    }
    
    int
    solve(int _n, int k)
    {
    	int v, j;
    	assert(2 <= _n && _n <= NMAX);
    	assert(1 <= k && k <= _n);
    	ll l, r, mid;
    	ll s;
    	if (k == 1) return 0;
    	n = _n;
    	if (k & 1) {
    		if (gcd(n, k + 1) > gcd(n, k - 1))
    			k++;
    		else
    			k--;
    	}
    
    
    	lcm = (ll)n * (ll)k / (ll)gcd(n, k);
    
    	v = get(0, k);
    	if (!v)
    		return 0;
    	if (v != -get(n / 2, k)) {
    		v = (v > 0) ? 1 : -1;
    
    		l = 1;
    		r = lcm / (ll)k - 1ll;
    		while (l < r) {
    			s = (r - l + 1) / 2;
    			if (v * get(l * (ll)k, s * (ll)k) > 0)
    				l += s;
    			else
    				r = l + s - 1;
    		}
    
    		l = 1;
    		r = (r * (ll)k) % n;
    		if (!r) r = n - 1;
    	}
    	else {
    		r = n / 2;
    	}
    
    	while (l < r) {
    		mid = (l + r) / 2;
    		j = get(mid, k);
    		if (j * v > 0)
    			l = mid + 1;
    		else if (j * v < 0)
    			r = mid - 1;
    		else
    			return mid;
    	}
    
    	return l;
    }
    
    • 1

    信息

    ID
    10933
    时间
    1000ms
    内存
    256MiB
    难度
    10
    标签
    递交数
    1
    已通过
    1
    上传者