题目描述
给定两个正整数n和k.输出不能被n整除的第个正整数.
例如,如果n=3,k=7,则所有不能被3整除的数是:1,2,4,5,7,8,10,11,13...其中的第7个数字是10.
输入
第一行包含一个整数t(1≤t≤1000) — 输入中的测试用例数。接下来,给出t个测试用例,每行一个。
每个测试用例是两个正整数n (2≤n≤10^9) 和k(1≤k≤10^9).
输出
对于每个测试用例,打印第k个不能被n整除的正整数.
输入样例
6
3 7
4 12
2 1000000000
7 97
1000000000 1000000000
2 1
输出样例
10
15
1999999999
113
1000000001
1
解题思路:
此题我们可以通过二分来求解,通过不断缩小区间范围来找到目标值,我们可以利用极小数1和极大数1e12来求中间值,中间值除以n即能被n整除的个数,则用中间值减去此数即为我们想求的数endlk,当然,为找到此目标值,我们需要不断缩小区间范围来求此数,由此我们可以用二分求解
如下图所示:
最终代码:
#include <iostream>
using namespace std;
int main()
{
int T;
cin >> T;//T代表输入的数据
while(T--)
{
long long n,k;
cin >> n >> k;//n代表除数,k代表不能被n整除的数的第k个数
long long l=1;
long long r=1e10;
long long endlk;//最终k的确定值
while(l<=r)
{
long long mid=(l+r)/2;
endlk=mid-mid/n;//mid/n表示能被n整除的个数
if(endlk==k)
{
if(mid%n==0)
{
cout << mid-1<<endl;
}
else
{
cout << mid<<endl;
}
break;
}
if(endlk<k)//如果结果在k的左边,l需右移以缩小范围
{
l=mid+1;
}
else
{
r=mid-1;//如果结果在k的右边,r需左移以缩小范围
}
}
}
return 0;
}