C++,codeforces, 1352C, C. K-th Not Divisible by n

/*
题目描述:
给定n和k,求从1开始的第k个不被n整除的数
*/
#include <iostream>
/*
令ans = x(以下过程除法结果均向下取整(int相除),用[]表示向下取整符号)
则x应满足 [x/n]+k=x , n,k均为输入
即在[1--x]内共有x个数字,其中有k个不被n整除, 即 x个数 = k个数 + [x/n]个数
有时,上式可以有两个解,一个是x,另一个是x-1,其中x为n的倍数,此时应取x-1
x = an+b(0<=b<=n-1) ==> a+k=an+b ==> k=a(n-1)+b
b = k%(n-1)
b==0时, k=a(n-1), a=[k/(n-1)]
x = an+b = [k/(n-1)]*n
但是此时,x也是n的倍数, x本身需要除去,
此时[1--x-1]内已有k个不被n整除的数,因此x应减1, 即x = [k/(n-1)]*n-1
[k/(n-1)]*n - 1
b==(n-1)时, k=(a+1)(n-1) , 则[k/(n-1)]=a+1
x = an+b = ([k/n-1]-1)*n + (n-1) = [k/(n-1)]*n-1
[k/(n-1)]*n - 1
b!=n-1时,1<=b<=(n-2) ==> a=[k/(n-1)], b=k%(n-1)
x = an+b = [k/(n-1)]*n + k%(n-1);
[k/(n-1)]*n + k%(n-1)
由于前两种情况k%(n-1) = 0,可以在表达式后加上"k%(n-1)"而不影响结果
可以统一为 x = [k/(n-1)]*n + k%(n-1)
*/
void solve2(){
int n,k;std::cin>>n>>k;
int ans = (k/(n-1))*n+k%(n-1) - (k%(n-1)==0);
std::cout<<ans<<std::endl;
}
/*
先让ans = k
先假设ans为第k个数,其中[1--k]中有k/n个能被n整除的数,它们不算在计数内
因此第k个数应为第k-k/n个数,
则让ans前进k/n个数,即ans += k/n
之后再检查前进的范围内是否有新的能被n整除的数,
如果有,说明前进后仍达不到第k个,需要再前进范围内能被n整除的数的个数
重复直到前进的范围内没有新的能被n整除的数
*/
void solve(){
int n,k;std::cin>>n>>k;
int counted = 0;
int ans = k;
while(ans/n > counted){
int temp = ans/n;
ans += temp-counted;
counted = temp;
}
std::cout<<ans<<std::endl;
}
int main(){
int t;std::cin>>t;
while(t--){
solve2();
}
}
posted @   Kazuma_124  阅读(6)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
历史上的今天:
2024-02-06 (C语言)代码学习||2024.2.6||题目是codewars上的【 IP Validation】
2024-02-06 (python)代码学习||2024.2.4||题目是codewars的【 All Balanced Parentheses】
点击右上角即可分享
微信分享提示