求欧拉函数

procedure euler;
 var
  i,j:longint;
   begin
     phi[1]:=1;
     for i:=2 to n do
       begin
         if not mark[i] then
           begin
             inc(tot);
             p[tot]:=i;
             phi[i]:=i-1;
           end;

         for j:=1 to n do
           begin
             if i*p[j]>n then break;
             mark[i*p[j]]:=true;
             if i mod p[j]=0 then
               begin
                 phi[i*p[j]]:=phi[i]*p[j];
                 break;
               end else phi[i*p[j]]:=phi[i]*(p[j]-1);
           end;
       end;
   end;

 c++

void euler(){
       b[1]=1;phi[1]=1;
       for (LL i=2;i<=n;i++){
            if (b[i]==0) {ss[++cnt]=i;phi[i]=i-1;}
            
            for (LL j=1;j<=cnt;j++){
                  if (i*ss[j]>n) break;
                  b[i*ss[j]]=1;
                  if (i%ss[j]==0) {phi[i*ss[j]]=phi[i]*ss[j];break;}
              else phi[i*ss[j]]=phi[i]*(ss[j]-1);
            }
       }
  } 

 

posted @ 2016-03-14 15:29  z1j1n1  阅读(184)  评论(0)    收藏  举报