欧拉函数运用:小明选蛋糕

欧拉函数相关知识

欧拉函数定义:

在数论,对正整数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

原文地址:https://www.cnblogs.com/beyondzones/p/12548085.html