欧拉函数
欧拉函数的用途是,求解小于某一个数字并且与该数字互质的正整数数目,证明省略(其实就是不会)
方法简记如下:
只求解单个数的欧拉函数:
ll init(ll k){
ll ans = k, i;
for(i = 2;i * i <= k; i++){
if(k%i == 0){
ans = ans / i * (i - 1);
while(k % i == 0){
k /= i;
}
}
}
if(k > 1)
ans = ans / k * (k - 1);
return ans;
}
打表用的欧拉函数:
const int maxn = (int)1e6;
ll dic[maxn];
void init(){
memset(dic,0,sizeof(dic));
for(int i = 2;i < maxn; i++){
if(!dic[i]){
for(int j = i;j < maxn; j+=i){
if(!dic[j]){
dic[j] = j;
}
dic[j] = dic[j] / i * (i - 1);
}
}
}
return ;
}
几个模板题目:
http://poj.org/problem?id=3090
https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1136