#欧拉函数及应用
标签:专题
一、欧拉函数的概念和本质
欧拉函数是指1到n中与n互质的的数的个数
*但是欧拉函数是工具,用来提供一到n中与n互质数的个数*
二、欧拉函数的性质
1.对于素数p,φ(p)=p-1,对于对两个素数p,q φ(pq)=pq-1
2.即φ(mn)=φ(n)*φ(m)只在(n,m)=1时成立.
3.如果n是质数的某一次方
φ(p^k)=p^k-p^(k-1)=p^k(1-1/p)
4.对于一个正整数N的素数幂分解N=P1^q1*P2^q2*...*Pn^qn.
φ(N)=N*(1-1/P1)*(1-1/P2)*...*(1-1/Pn).
5.我们知道,一个数K能分解成p1^(q1)*p2^(q2)...
那么,这个数的因子个数就是(1+q1)*(1+q2)*...*(1+qk)
三、实际操作
1.Longge的问题
你需要求出∑gcd(i, N)(1<=i <=N)。
#Solution
题目中要求出∑gcd(i,N)(1<=i<=N)。
枚举n的约数k,令s(k)为满足gcd(m,n)=k,(1<=m<=n)m的个数,则ans=sigma(k*s(k)) (k为n的约数)
因为gcd(m,n)=k,所以gcd(m/k,n/k)=1,于是s(k)=euler(n/k)
#include<iostream>
#include<cstdio>
#include<cmath>
#define LL long long
using namespace std;
LL n,ans;
int m;
LL phi(LL x)
{
LL t=x;
for(LL i=2;i<=m;i++)2018-02-22
if(x%i==0)
{
t=t/i*(i-1);
while(x%i==0)x/=i;
}
if(x>1)t=t/x*(x-1);
return t;
}
int main()
{
scanf("%lld",&n);
m=sqrt(n);
for(int i=1;i<=m;i++)
if(n%i==0)
{
ans+=(LL)i*phi(n/i);
if(i*i<n)ans+=(LL)(n/i)*phi(i);
}
printf("%lld",ans);
return 0;
}
2. 仪仗队
#Solution
只有列数和行数互质的才能看见.
#include<bits/stdc++.h>
using namespace std;
int n,m,tot;
int phi(int x){
int t=x;
for(int i=2;i<=sqrt(x);i++)
if(x%i==0){
t=t/i*(i-1);
while(x%i==0)x/=i;
}
if(x>1)t=t/x*(x-1);
return t;
}
int main(){
cin>>n;
if(n==1){
cout<<0;
return 0;
}
m=sqrt(n);
for(int i=1;i<n;i++)
tot+=phi(i);
tot*=2;
tot++;
cout<<tot<<endl;
return 0;
}