题解 [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;
}
posted @ 2024-02-18 10:03  Chen_Jinhui  阅读(46)  评论(0)    收藏  举报  来源