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