zoukankan      html  css  js  c++  java
  • 神炎皇 数学

    问题概述:

      求在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=$sumlimits_{k=2}^{k<=sqrt(N)}$(N/(k*k))*phi(k);

  • 相关阅读:
    我的Asp.Net Hello World程序

    快速排序
    Python是一门什么样的语言
    Python开发简介
    LVS(Linux Viretual Server) 负载均衡器 + 后端服务器
    易迷糊题
    python语言入门 第四天
    日常练习 1.0
    User_Login_Register_Shopping 1.0
  • 原文地址:https://www.cnblogs.com/wang-hesong/p/11649497.html
Copyright © 2011-2022 走看看