1 条题解

  • 0
    @ 2025-8-24 22:31:32

    自动搬运

    查看原文

    来自洛谷,原作者为

    avatar yyyyxh
    OI 是啥 (O_o)?

    搬运于2025-08-24 22:31:32,当前版本为作者最后更新于2022-03-12 09:54:08,作者可能在搬运后再次修改,您可在原文处查看最新版

    自动搬运只会搬运当前题目点赞数最高的题解,您可前往洛谷题解查看更多

    以下是正文


    挺奇怪的一道题,虽然各种乱搞可过但还是很有思考价值的。

    首先这道题有一个正经的构造做法,gcd(a,b,c)>1\gcd(a,b,c)>1 时直接判掉无解,设 gcd(b,c)=x\gcd(b,c)=x ,如果 x=1x=1 ,那么 n=0n=0 就满足条件。

    否则我们可以发现 gcd(a+b,x)=1\gcd(a+b,x)=1 (因为有 gcd(a,b,c)=1\gcd(a,b,c)=1),由于一个数 xx 满足 gcd(x,y)=1,gcd(x,z)=1\gcd(x,y)=1,\gcd(x,z)=1 ,那么 gcd(x,yz)=1\gcd(x,yz)=1 (可以反证),也就是说如果 gcd(a+b,cx)=1\gcd(a+b,\frac{c}{x})=1 那么 n=1n=1 就是答案。

    考虑给 a+ba+b 加上若干个 axax ,这样依然有 gcd(kax+a+b,x)=1\gcd(kax+a+b,x)=1 ,现在是要找出一个 kk 满足 gcd(kax+a+b,cx)=1\gcd(kax+a+b,\frac{c}{x})=1 ,发现是一个子问题,递归即可。由于 x>1x>1 ,所以顶多递归 log2c\log_2{c} 层(实际上平均只会递归两三层)。

    有两个小问题,第一个是要保证子问题依然有解(不然一个有解的情况递归到无解的情况构造不出了)。考虑归纳证明只要 gcd(a,b,c)=1\gcd(a,b,c)=1 即有解,那么反证,假设有素数 pgcd(ax,a+b,c)p|\gcd(ax,a+b,c) ,那么一定有 pap|apxp|x ,若 pxp|x ,则 pbp|b ,又因为 pa+bp|a+b ,所以又归到了 pap|a 的情况,那么如果 pap|a ,因为 pa+bp|a+b,所以 pbp|b ,因为 pcp|c ,所以 pgcd(a,b,c)p|\gcd(a,b,c) 与前提矛盾。因此递归的任何一个子问题都是有解的。

    第二个是解的大小的问题,注意到递归过程中所有 xx 的乘积不超过 cc ,那么最终结果的级别是 O(c)O(c) 的,看起来有可能会超过 10200010^{2000} ,但由于完全跑不满因此不会。

    Code 1

    from math import gcd
    def solve(a,b,c):
        x=gcd(b,c)
        if x==1:
            return 0
        return solve(a*x,a+b,c//x)*x+1
    
    for i in range(int(input())):
        a,b,c=map(int,input().split())
        if gcd(a,gcd(b,c))>1:
            print(-1)
            continue
        print(solve(a,b,c))
    

    但是这道题直接从小到大枚举 nn 或者随机化就可以过。虽然不会严谨的时间复杂度,但是是可以感性理解一下的。

    具体来说,关键在于一个数的不同素因子的个数是在 O(logc)O(\log c) 级别的,考虑用 cc 的素因子个数对 nn 的最小解进行感性分析。对于一个最小解 nn',也就是说 n<n,gcd(an+b,c)>1\forall n<n',\gcd(an+b,c)>1 ,取一个数 ss 和素数 tt 满足 s+t<ns+t<n' ,假设 pgcd(sa+b,c),qgcd((s+t)a+b,c)p|\gcd(sa+b,c),q|\gcd((s+t)a+b,c) ,如果 p=qp=q ,那么有 ptap|ta ,明显 p∤ap\not|a ,否则 gcd(a,b,c)>1\gcd(a,b,c)>1 ,所以有 ptp|t ,限制 tt 为素数,那么就有 p=tp=t ,也就是说有 tct|c

    上述分析感性说明一下,就是对于一个间隔为素数的不满足条件的 nn ,要么 pqp\neq q ,这样 cc 就会分析出两个不同的素因子,要么 p=qp=q ,这样这个间隔就是 cc 的素因子,由于 cc 的素因子本来就不会很多, nn' 足够大时其中每一种素数间隔都会至少贡献一种不同的质因子,大胆猜测 nn 的最小解也会是 O(logc)O(\log c) 级别的,基于同样的思想我们也可以猜测随机化也只会期望猜 O(logc)O(\log c) 次。

    当然,上述只是一个非常不严谨的对最小解大小的猜测式的分析,大家看一看就行了。

    Code 2

    from math import gcd
    for i in range(int(input())):
        a,b,c=map(int,input().split())
        if gcd(a,gcd(b,c))>1:
            print(-1)
            continue
        n=0
        while gcd(a*n+b,c)>1:
            n=n+1
        print(n)
    
    • 1

    信息

    ID
    6785
    时间
    2000ms
    内存
    128MiB
    难度
    5
    标签
    递交数
    0
    已通过
    0
    上传者