随笔 - 531  文章 - 0  评论 - 3  阅读 - 10215 

对正整数 n,欧拉函数是小于等于 n 的数中与 n 互质的数的个数

 

性质摘要

1.  a,b互质, f(a*b) =f(a)*f(b)

2.   f(x^a) = (x-1)*   f(x^(a-1))

3.    if i%j==0    f(i*j)= f(i) *j

4.    if i%j !=0  f(i*j)=f(i) * (j-1)

 

根号复杂度的求法依据公式 

 

1
2
3
4
5
6
7
8
9
10
11
12
void sov(int n){
   int i,ans=n;
    
   for(i=2;i*i<=n;i++){
       if(n%i==0){
           ans=ans/i*(i-1);
           while(n%i==0) n/=i;
       }
   }
   if(n>1) ans=ans/n*(n-1);
   cout<<ans;
}

 

复制代码
#include <iostream>
#include<vector>
using namespace std ;


void sov(int n){
   int i,fi=1;
    
   for(i=2;i*i<=n;i++){
       if(n%i==0){
           fi*=i-1;
           n/=i ;
           while(n%i==0) fi*=i, n/=i;
       }
   }
   if(n>1) fi*= n-1;
   cout<<fi; 
}

signed main(){
   sov(1690) ;
}
复制代码

 

 

线筛求法,依据3,4

复制代码
const int M=1e6;
 int vis[M+4],P[M+4],cnt;
 int fi[M+4];
 
 void shai(int top){
     cnt=0;
     fi[1]=1;
     for(int i=2;i<=top;i++){
         if(vis[i]==0){
             P[++cnt]=i; 
             fi[i]=i-1;
         }
         for(int j=1;j<=cnt&&i*P[j]<=top;j++){
             vis[i*P[j]]=1;
             if(i%P[j]==0){
                 fi[i*P[j]]=fi[i]*P[j];
                 break;
             }
            else
            fi[i*P[j]]=fi[i]*(P[j]-1);
         }
     }
 }
复制代码

 

posted on   towboat  阅读(20)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!
点击右上角即可分享
微信分享提示