zoukankan      html  css  js  c++  java
  • 欧拉函数运用:小明选蛋糕

    欧拉函数相关知识

    欧拉函数定义:

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

  • 相关阅读:
    分页查询SQL语句
    屏蔽Ctrl+C
    RichtextBox 控件小节
    必须掌握的八个CMD命令
    [唠叨两句]一个关于OpenFileDialog 影响 相对路径的问题
    反序列化出现异常:SerializationException 在分析完成之前就遇到流结尾
    Static块(静态代码块)
    Java ServletContext 详解
    tomcat中conf\Catalina\localhost目录下的J2EE项目METAINF配置文件
    关于【apache tomcat 5.5.15/conf /Catalina/localhost配置虚拟目录】时的一些问题。(配置web项目的方式不止一种,虚拟目录就是一个)
  • 原文地址:https://www.cnblogs.com/beyondzones/p/12548085.html
Copyright © 2011-2022 走看看