• bzoj 2705 数学 欧拉函数


    首先因为N很大,我们几乎不能筛任何东西

    那么考虑设s(p)为 gcd(i,n)=p 的个数,显然p|n的时候才有意义

    因为i与n的gcd肯定是n的因数,所以那么可得ans=Σ(p*s(p))

    那么对于s(p),我们有gcd(i,n)=p即gcd(i/p,n/p)=1,也即phi(n/p)

    所以枚举因数求phi就好了

    /**************************************************************
        Problem: 2705
        User: BLADEVIL
        Language: Pascal
        Result: Accepted
        Time:12 ms
        Memory:228 kb
    ****************************************************************/
     
    //By BLADEVIL
    var
        n                           :longint;
        i                           :longint;
        pi                          :array[0..510] of longint;
        cur                         :longint;
        ans                         :int64;
         
    function phi(x:longint):longint;
    var
        i                           :longint;
    begin
        cur:=x;
        phi:=x;
        for i:=2 to trunc(sqrt(x)) do
        begin
            if cur mod i=0 then
            begin
                phi:=(phi div i)*(i-1);
                while cur mod i=0 do cur:=cur div i;
                if cur=1 then break;
            end;
            if cur=1 then break;
        end;
        if cur<>1 then phi:=(phi div cur)*(cur-1);
    end;
         
    begin
        read(n);
        for i:=1 to trunc(sqrt(n)) do
        begin
            if n mod i=0 then
            begin
                inc(pi[0]);
                pi[pi[0]]:=i;
                if n div i<>i then
                begin
                    inc(pi[0]);
                    pi[pi[0]]:=n div i;
                end;
            end;
        end;
        ans:=0;
        for i:=1 to pi[0] do
            ans:=ans+int64(pi[i]*phi(n div pi[i]));
        writeln(ans);
    end.
  • 相关阅读:
    jQuery选择器
    jquery处理json笔记
    观察者模式
    shiro自定义realm
    AysncTask更新progressbar
    android自定义控件
    任务的挂起和激活
    main方法添加2个集合存储图形
    矩形类-内部类刷新
    圆类-内部类多线程刷新
  • 原文地址:https://www.cnblogs.com/BLADEVIL/p/3488065.html
Copyright © 2020-2023  润新知