神炎皇 数学
问题概述:
求在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);