CF1606B Update Files

题目大意

给定一个 n,kn,k,有一个数列 20,21,22,23,...2^0,2^1,2^2,2^3,...,第 ii 个数为 2i12^{i-1}

特别的,若第 kk 个数,2k1k2^{k-1} \ge k,就将第 kk 个数改为 kk

若这个数列前 qq 个数的和 n<\leq n < 这个数列前 q+1q+1 个数的和,q+1q+1 即为答案。

输出答案 q+1q+1

TT 组数据。

1T1051≤T≤10^51kn10181 \leq k \leq n \leq 10^{18}

解题思路

很明显了。

模拟即可。

最后结果为

n2mk+m(2m1k<2m,2mn)\lceil \frac{n - 2^m}{k} \rceil + m (2^{m-1}\leq k < 2^m,2^m \leq n)

时间复杂度 O(64T)\mathcal{O}(64T)

CODE

#include <cstdio>
using namespace std;

int T;

long long n, k;

signed main()
{
	scanf("%d", &T);
	while(T--)
	{
		scanf("%lld%lld", &n, &k);
		if(n == 1)
		{
			printf("0\n");
			continue;
		}
		if(k == 1)
		{
			printf("%lld\n", n - 1);
			continue;
		}
		long long b = 1, cnt = 0;
		while(b <= k && b * 2 <= n)
		{
			b *= 2;
			cnt++;
		}
		n -= b;
		cnt += n / k + (n % k == 0 ? 0 : 1);
		printf("%lld\n", cnt);
	}
	return 0;
}
posted @ 2021-11-02 12:52  蒟蒻orz  阅读(3)  评论(0编辑  收藏  举报  来源