神炎皇 数学

问题概述:

  求在1-N内有多少点对(a,b)满足a+b<=N&&(a+b)|(a*b)

数据范围 :N<=1e14;

考虑套路:设d=gcd(a,b);则a=d*a',b=d*b';

那么 原来的 a*b=a'*b'*d^2;

问题转化为 :d*(a'+b')|a'*b'*d^2 的个数

颓式子:

d*(a'+b')|a'*b'*d^2  -> (a'+b')|a'*b'*d

因为 a'和b'互质,且 a'!=b' ,那么a'*b'一定不能是 a'+b' 的倍数

所以 (a'+b')|a'*b'*d ->(a'+b')|d

我们设 k=(a'+b'),f(k)为有多少对 gcd(a,b)==1 && 且 a+b==k 的点对;

即求 f(k)|d;

我们先考虑f(k)对答案的贡献:

先看看前置姿势:

if(gcd(a,b)==1) gcd(a,a+b)==1 and gcd(b,a+b)==1;(更相减损法)

而我们要求 a'+b'==k && gcd(a',b')==1 的点对个数;

结合 gcd(a,k)==1;

可得 答案数为 phi(k);

想想为什么?

首先 a'和 b'都比 k 小 ,且 有了 a' 可得 b'=k-a';

而且 gcd(a,b)==1 -> gcd(a,k)==1

这不就是 $ 欧拉函数 $ 吗...

k的贡献就处理完了.........

再返回 要求 f(k)|d

一看这个式子 except Euler

still O(N);(d->(√N),枚举k->(√N))

但是我们可以想一想

其实只枚举k就行了

然后直接d=N/k;

那么d内就有d/k个f(k);

于是我们就可以得出答案

ans=$\sum\limits_{k=2}^{k<=sqrt(N)}$(N/(k*k))*phi(k);

posted @ 2019-10-10 17:50  Hzoi_whs  阅读(132)  评论(0编辑  收藏  举报