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 顯然,用這個方法來計算單個尤拉函式是可以求解的。附...