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;
} 

  

posted @ 2020-06-08 22:22  菜鸡今天学习了吗  阅读(256)  评论(0编辑  收藏  举报