题解 [ABC341D] Only one of two
赛后在讨论区里看到都是二分的解法?那我来补一个非二分的。
题意
求第 $K$ 小能整除 $N,M$ 其中只有一个的正整数。
分析
设 $L=\operatorname{lcm}(N,M)$。
我们把所有满足条件的数列出来排序,观察到 $\dfrac L N + \dfrac L M - 2$ 是一个周期。
如何证明?小于 $L$ 的 $N$ 的倍数有 $\dfrac L N -1$ 个,$M$ 的倍数有 $\dfrac L M - 1$ 个。
容易证明,相邻两个周期之间相同位置的数相差 $L$。
所以直接求出第一个周期就可以了。
时间复杂度 $O(N+M)$,最坏情况是 $\gcd(N,M)=1$,可以通过此题。
代码
//the code is from chenjh
#include<cstdio>
#include<algorithm>
using namespace std;
typedef long long LL;
typedef __int128 ll;
int n,m;
LL k;
void write(const ll&x){
if(x>9) write(x/10);
putchar(x%10+'0');
}
int main(){
scanf("%d%d%lld",&n,&m,&k);
--k;
LL lcm=(LL)n/__gcd(n,m)*m;//求出最小公倍数。
int r=lcm/n+lcm/m-2;
ll b=(ll)k/r*lcm;//求出这是第几个周期再加上周期相差的最小公倍数。
k%=r;
LL x=n,y=m;//求出最初的周期。
for(int i=0;i<k;i++){
if(x<y) x+=n;
else y+=m;
}
write(min(x,y)+b);
return 0;
}

浙公网安备 33010602011771号