尤拉函式的求法

2021-09-25 18:57:52 字數 1312 閱讀 5328

long long eular(long long n)

}if(n>1)

ans-=ans/n;

return ans;

}

const int maxn=1e5;

const int branch=26;

const int inf=0x3f3f3f3f;

const int mod=1e6+7;

int euler[maxn+10];

void geteuler()

}

改進後的一般求法,先求出所有maxn之前的所有,在求尤拉函式是列舉sqrt(n)前的素數就行了

#include#include#include#include#include#include#include#define mset(a,b)   memset(a,b,sizeof(a))

using namespace std;

typedef unsigned long long ull;

typedef long long ll;

const int maxn=1e6;

const int branch=26;

const int inf=0x3f3f3f3f;

const int mod=1e6+7;

int book[maxn+10],prime[(int)1e5+10];

int top;

void init()//求出100w以內的所有素因子

for(int i=2;i<=maxn;++i)

if(!book[i])

prime[top++]=i;

}int phi(int val)//求1~n中與n互質的個數}}

if(val>1)

ans=ans/val*(val-1);

return ans;

}

利用尤拉函式的積性優化後的篩法,時間複雜度最低,為o(n)  

bool check[maxn+10];

int phi[maxn+10];

int prime[maxn+10];

int tot;//素數的個數

void phi_and_prime_table(int n)//1~n以內的所有素數 以及尤拉函式

for(int j=0;jn) break;

check[i*prime[j]]=true;

if(i%prime[j]==0)

else}}

}

尤拉函式求法

法一 根號n做法 int phi int n if n 1 ans ans n n 1 return ans 法二 線性篩做法 寫在前面 對於尤拉函式有如下三條性質 p為素數 1 phi p p 1 2 當p與i互質時有 phi p i phi p phi i 3 當i p 0時有 phi p i ...

尤拉函式的求法

定義 尤拉函式f n 表示小於或等於n的數中與n互質的數的個數 通式 f n n 1 1 p1 1 1 p2 1 1 pn 其中p1,p2 pn為x的所有質因數,x是不為0的整數。1 1 唯一和1 互質的數 小於等於1 就是1本身 注意 每種質因數只乙個。比如12 2 2 3那麼 12 12 1 1...

尤拉函式性質與求法 數論 尤拉函式

n的尤拉函式值用符號 n 表示 尤拉函式的定義是,對於乙個正整數n,小於n且與n互質的數的數目 包括1,特殊地,1 1 設p1,p2,p3,pr為n的全部r個質因數,則有 n n 1 1 p1 1 1 p2 1 1 p3 1 1 p4 1 1 pr 顯然,用這個方法來計算單個尤拉函式是可以求解的。附...