CF 1499 E. The Number of Pairs

题目链接:1499 E. The Number of Pairs

式子: c ⋅ l c m − d ⋅ g c d = x c⋅lcm− d⋅gcd=x clcmdgcd=x

尝试一:
l c m = a ⋅ b / g c d lcm = a· b / gcd lcm=ab/gcd,两边同乘 gcd 后变成 d ⋅ g c d 2 + x ⋅ g c d − a b c = 0 d·gcd^2+ x·gcd - abc = 0 dgcd2+xgcdabc=0,然后尝试了 b 2 − 4 a c ≥ 0 \sqrt{b^2 - 4ac} ≥ 0 b24ac 0 a ≥ g c d , b ≥ g c d a≥gcd,b≥gcd agcdbgcd 等等限制范围看能不能暴力啥的

尝试二:
暴力怎么做呢?假设gcd确定,lcm也是唯一确定的,那么就是求有多少对不同的pair(a,b) 满足 g c d ( a , b ) = g c d , l c m ( a , b ) = l c m gcd(a,b)=gcd,lcm(a,b)=lcm gcd(a,b)=gcdlcm(a,b)=lcm(重名好像有点怪qwq),令 a = x ∗ g c d , b = y ∗ g c d a=x*gcd, b=y*gcd a=xgcd,b=ygcd,且x、y互质, l c m = a ∗ b / g c d = x ∗ y ∗ g c d lcm = a*b/gcd = x*y*gcd lcm=ab/gcd=xygcd,那就是求有多少对 (x,y) 满足 x、y互质而且 x ∗ y = l c m g c d x*y=\frac{lcm}{gcd} xy=gcdlcm

首先把 l c m g c d \frac{lcm}{gcd} gcdlcm 弄出来:
c ∗ l c m − d ∗ g c d = x c*lcm− d*gcd=x clcmdgcd=x
-> c ∗ l c m = d ∗ g c d + x c*lcm=d*gcd+x clcm=dgcd+x
-> l c m g c d = d + x g c d c \frac{lcm}{gcd}=\frac{ d + \frac{x}{gcd} }{c} gcdlcm=cd+gcdx
要使 l c m g c d \frac{lcm}{gcd} gcdlcm为整数,首先 x g c d \frac{x}{gcd} gcdx要是个整数,那 x g c d \frac{x}{gcd} gcdx必然是 x x x 的因子,再判断 x 的 因 子 + d x_{的因子}+d x+d 能否整除 c c c 即可。这部分 x \sqrt{x} x 解决

然后要求有多少对 (x,y) 满足 x、y互质而且 x ∗ y = k x*y=k xy=k
k k k进行素因子分解(去重),把其中一部分给 x x x,其它的给 y y y。方案数是 2 k 的 不 同 素 因 子 个 数 2^{k的不同素因子个数} 2k。但是怎么快速预处理 k k k 不同的素因子个数就不会了,看了题解学了手:
首先我们要知道 x x x的最小素因子 m i n _ d [ x ] min\_d[x] min_d[x],这个用埃氏筛解决,在更新时标记(线性欧拉筛也行,就是要多开个数组)
然后对于每一个 x x x(假设1~x之间每个数有多少不同的素因子我们已经知道了),令其最小的素因子为 j j j,令 k = x / i k=x/i k=x/i,首先 k k k的所有素因子必然是 x x x的,进一步观察可一发现 m i n _ d [ j ] ≤ m i n _ d [ k ] min\_d[j]≤min_\_d[k] min_d[j]min_d[k]:如果 k k k存在比 x x x更小的素因子,这个素因子肯定也属于 x x x,所以不可能。那么如果 m i n _ d [ j ] < m i n _ d [ k ] min\_d[j]<min\_d[k] min_d[j]min_d[k] 的话?
于是就可以线性求解出来了:

    num[2] = 1; num[3] = 1; num[4] = 1;
    for(int i=5;i<N;i++){
    	// min_d[i] == -1是i为质数的情况,我这里写丑了,可以看CF官方题解的代码。
        if( min_d[i] == -1 )num[i] = 1;
        else{
            int j = i / min_d[i];
            num[i] = num[j] + (min_d[i] != min_d[j]); 
        }
    }

CF官方题解有代码:题解

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值