zoukankan      html  css  js  c++  java
  • bzoj2705

    一个常用的结论(方法)

    只要知道gcd(i,n)=L 的i的个数s,我们就能很轻易得出答案

    gcd(i,n)=L

    gcd(i/L,n/L)=1  

    不难得到这样的s=与n/L互质的个数=phi(n/L)

    一个数的欧拉函数最坏情况是可以在O(sqrt(n))的复杂度中弄出来的

    我们可以穷举L,只要从1穷举到根号n即可

     1 var i:longint;
     2     ans,n:int64;
     3 
     4 function phi(x:int64):int64;
     5   var i:longint;
     6   begin
     7     phi:=1;
     8     for i:=2 to trunc(sqrt(n)) do
     9       if x mod i=0 then
    10       begin
    11         phi:=phi*(i-1);
    12         x:=x div i;
    13         while x mod i=0 do
    14         begin
    15           x:=x div i;
    16           phi:=phi*i;
    17         end;
    18         if x=1 then break;
    19       end;
    20     if x>1 then phi:=phi*(x-1);
    21   end;
    22 
    23 begin
    24   readln(n);
    25   for i:=1 to trunc(sqrt(n)) do
    26     if n mod i=0 then
    27     begin
    28       ans:=ans+phi(n div i)*i;
    29       if i<>n div i then ans:=ans+phi(i)*(n div i);
    30     end;
    31   writeln(ans);
    32 end.
    View Code
  • 相关阅读:
    C标准库函数实现
    每天一句话
    移植数码相框到arm开发板上
    数据管理
    perl 分割文件路径和文件名
    恶补英语 拿 The C programming language 练功
    英语学习 chapter1
    uboot 烧写过程
    MVC,去掉字符串中的html代码
    排序之希尔排序
  • 原文地址:https://www.cnblogs.com/phile/p/4473169.html
Copyright © 2011-2022 走看看