Week13 作业 B - K-th Not Divisible by n - CodeForces - 1352C
题目描述:
给定N和K,找第K个不能被N整除的正整数(2 ≤ N ≤ 1e9)、(1 ≤ K ≤ 1e9)
思路:
- 很显然要从1开始数,一直数到第K个,很显然数是递增的,再结合如此大的数据范围,可以推测使用二分
- 二分什么?直接二分答案,那么给定M,如何判断M是不是第K个不能被N整除的数?考虑一个简单的例子:N=3,M=16,则从1到M这16个数中,有3,6,9,12,15是能被N整除的,正好是5个,正好等于16/3,所以M是第M-M/N个不能被N整除的数
- 但是,注意:不能漏掉最基本的限制条件,M不能被N整除
- 二分边界:左边界L=K,右边界R=N*K,(其实边界很随意)
代码:
#include <cstdio>
#include <iostream>
using namespace std;
typedef long long ll;
int main()
{
int T;
cin>>T;
while(T--)
{
ll N,K;
cin>>N>>K;
ll l=K,r=N*K;
while(l<=r)
{
ll m=(l+r)/2;
ll al=m-m/N;
if(al==K && m%N!=0)
{
cout<<m<<endl;
break;
}
if(al<K) l=m+1;
else r=m-1;
}
}
return 0;
}

浙公网安备 33010602011771号