CF1606B Update Files
题目大意
给定一个 ,有一个数列 ,第 个数为 。
特别的,若第 个数,,就将第 个数改为 。
若这个数列前 个数的和 这个数列前 个数的和, 即为答案。
输出答案 。
组数据。
,。
解题思路
很明显了。
模拟即可。
最后结果为
时间复杂度 。
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;
}
本文来自博客园,作者:蒟蒻orz,转载请注明原文链接:https://www.cnblogs.com/orzz/p/18122104