BACS2018 A: A Criminal二阶约瑟夫环


 #include<bits/stdc++.h>
using namespace std;
#define ll long long
int t;
ll gcd(ll a, ll b) { return b==0?a :gcd(b, a%b) ; }
ll x, l, n;
ll func(ll s) {
	ll  ans = 0;
	if (x % 2 == 0) return 0;
	for (ll i = 1; i <= s; i *= 2) {
		ll up = min(2 * i - 1, s);//上界
		ll down = i;//下界
		ll num = up - down + 1;//数量
		if (x <= 2 * num - 1) ans++;//判断
	}
	return ans;
}
int main() {
	scanf("%d", &t);
	for (int cas = 1; cas <= t; cas++) {
		scanf("%I64d%I64d%I64d", &x, &l, &n);
		ll ret = func(n) - func(l - 1);
		if (x > l) ret += x - l;
		ll all = n - l + 1;
		ll zz = gcd(all, ret);
		printf("Case %d: %I64d/%I64d\n", cas, ret / zz, all / zz);
	}
	return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_37765455/article/details/81781518