zoukankan      html  css  js  c++  java
  • bzoj2818 Gcd(欧拉函数)

    Description

    给定整数N,求1<=x,y<=N且Gcd(x,y)为素数的
    数对(x,y)有多少对.

    Input

    一个整数N

    Output

    如题

    Sample Input

    4

    Sample Output

    4

    HINT


    对于样例(2,2),(2,4),(3,3),(4,2)

    1<=N<=10^7

    Source

    湖北省队互测

    若gcd(a,b)=素数p,则a=px,b=py且gcd(x,y)=1,这样,我们枚举小于n的素数p,对于每个素数p,只需求小于等于n/p的数中互质的数的对数,就是以p为gcd的a,b的对数。要求小于某个数k的数种互质的对数,可考虑欧拉函数(设欧拉函数为f,不会打phi勿喷),则对数等于2(f(1)+f(2)+...+f(k))-1,乘2是因为顺序不同的算两个,减1是因为(1,1)不能算两次。这样我们只需预处理出欧拉函数表,再处理出它的前缀和就可以了。

     1 program rrr(input,output);
     2 var
     3   f:array[0..10000000]of int64;
     4   p:array[0..10000000]of boolean;
     5   n,m,i,j:longint;
     6   ans:int64;
     7 begin
     8    assign(input,'r.in');assign(output,'r.out');reset(input);rewrite(output);
     9    readln(n);m:=n>>1;
    10    fillchar(p,sizeof(p),true);
    11    for i:=1 to n do f[i]:=i;
    12    for i:=2 to n do
    13       if p[i] then
    14          begin
    15             j:=i;while j<=m do begin f[j]:=f[j] div i*(i-1);j:=j+i; end;
    16             j:=i<<1;while j<=n do begin p[j]:=false;j:=j+i; end;
    17          end;
    18    for i:=2 to m do f[i]:=f[i]+f[i-1];
    19    for i:=1 to m do f[i]:=f[i]<<1;
    20    ans:=0;
    21    for i:=2 to n do if p[i] then ans:=ans+f[n div i]-1;
    22    write(ans);
    23    close(input);close(output);
    24 end.
  • 相关阅读:
    PHP程序员7小时学会Kotlin 第二小时
    PHP程序员7小时学会Kotlin系列
    PHP程序员7小时学会Kotlin系列
    技术人员如何形成正确的价值观
    景德镇特色的部门级别与权限
    hhvm的正确安装姿势 http://dl.hhvm.com 镜像
    有钱没钱
    SB心结
    优秀的技术Leader
    BaaS模式的开发思路
  • 原文地址:https://www.cnblogs.com/Currier/p/6480672.html
Copyright © 2011-2022 走看看