欧拉函数相关知识
欧拉函数定义:
在数论,对正整数n,欧拉函数是小于或等于n的正整数中与n互质的数的数目
欧拉函数通式:
注意点:
1.每种质因数只进行一次操作
2.互质:两个整数公约数只有1称这两个整数互质
3.质数:质数是指在大于1的自然数中,除了1和它本身以外不再有其他因数的自然数。
4.“小于等于n的质数个数”与“小于或等于n且和n互质的正整数个数”为不同概念,不要混淆
代码实现:
long long eular(long long n){
long long ans=n;
for(long long i=2;i*i<=n;i++){
if(n%i==0){
ans=ans/i*(i-1);//B
while(n%i==0) n/=i; //将相同质因数都删去
}
}
if(n>1) ans=ans/n*(n-1);//A
return ans;
}
这一种欧拉函数的实现思路是基于质因数分解,例如50,质因数分解后为2 * 5 * 5,由于是从小到大遍历,所以在最后一种质因数之前的质因数只要在sqrt(n)的范围内就能够被筛选出来。而最后一种质因数要通过特判,A步骤就是用来确保最后一种的质因数也经过了处理。
补充:也可以把B位置改写成ans=ans-ans/i用筛法的思路去解读:选出n的质因数,由于n大于1的质因数及其倍数与n一定不互质,所以减去,筛到最后剩下的就是小于或等于n的正整数中与n互质的数的数目
应用实例:小明选蛋糕
小明舍友生日快到了,他决定背着舍友偷偷为他准备一个蛋糕,但是蛋糕款式众多,他也很难选择,于是他决定根据蛋糕摆放的位置来缩小蛋糕选择的范围。
已知小明从第a个蛋糕开始选择,他规定一个比a大的数m(1<=a<m<=10^10),小明只对满足下式的x(0<=x<m)位置上的蛋糕感兴趣,
gcd(a,m)=gcd(a+x,m)
经过这样的筛选后,可供小明选择的蛋糕款式还剩多少呢?
输入格式:
第一行包含一个整数T(1<=T<=50),表示输入数据共T组;
接下来共有T行,每行包含两个整数a和m (1<=a<m<=10^10)
输出格式:
输出共T行,每行一个整数k,表示经过筛选后可供小明选择的蛋糕款式的数量。
输入样例:
3
4 9
5 10
42 9999999967
输出样例:
6
1
9999999966
解题思路
(摘自LZF同学的解题报告)
ps.用辗转相除法的思想可以解释gcd(x+y,y)=gcd(x,y)=1