题目名称:
整除问题
题目描述:
给定两个正整数 n 和 k 。求出第 k 个不能被 n 整除的正整数。例如, n=3 , k=7 ,那么所有不能被 3 整除的数字是: 1,2,4,5,7,8,10,11,13… 。第 7 位数字是 10 。
输入格式:
第一行包含一个整数 t ( 1≤t≤1000 ) ,表示测试数据的组数;
每组测试数据占一行,包含两个正整数 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
分析:
先看样例的第一组数据:3 7
。我发现他们相加等于10耶 :
能被3整除的只有3,6,9,12…这些3的倍数的数。所以求第7个不能被3整除的数,我们只需把3的倍数给排除掉,输出排除掉以后的第7个数即可。
怎么查找???
在上图中我们不难发现,3的任意两个相邻的倍数之间,不能被3整除的数恰好是3-1个。所以我们可以将n - -,表示需要查找的每个区间的数量。再用k去除以n,求出k属于哪个区间。最后乘上(n+1)就能得到结果啦~~
注意:当k<n时,可以直接输出k,因为1…n-1都不是n的倍数
代码:
#include<bits/stdc++.h>
using namespace std;
long long T;
int main()
{
cin>>T;
while(T--)
{
long long k,n;
cin>>n>>k;
if(k<n)//特判k<n
{
cout<<k<<endl;
continue;
}
n--;//因为要排除掉n的倍数,所以只用查找1...n-1,n+1...2n-1,......
if(k%n==0)//如果能被n整除
{
cout<<k/n*(n+1)-1<<endl;//输出那个数
}
else
{
int i;
for(i=1;;i++)//应该都理解吧······
{
k++;
if(k%n==0)
{
break;
}
}
cout<<k/n*(n+1)-i-1<<endl;
}
}
return 0;
}
结束啦~~~