• .欧拉函数.


    先介绍欧拉函数
    贴一张

    证明:

    这里利用容斥原理来进行证明:若要求1~N当中与N互质的个数,则应在1~N当中去除N的质因数的倍数,因为既然是因数,那么一定不与N互质,既然是N的因数,那么一定是N的质因数的倍数。对于上述公式里的质因数pi来说,在1~N上pi倍数的个数即为N/pi
    那么1~N中与N互质的个数即为:N-N/p1-N/p2-......-N/pi。但是会有质因数的倍数被重复去除,例如6即使质因数2的倍数,也是质因数3 的倍数,那么6就会先被2去除,再被3去除。如下图:

    浅蓝色的区域表示被去除两次,那么我们需要将其加回来则上述变为:N-N/p1-N/p2-......-N/pi+N/(p1*p2)+N/(p2*p3)+N/(p1*p3)+......+N/(pi*pj)。

    这个时候问题来了深色的区域又被加了三次,那么则需要将其减去,同样的如果是多个质因数的倍数被多次减去,那么就会重复上面的错误
    那么1~N中与N互质的个数即为:N-N/p1-N/p2-......+N/(p1*p2)+N/(p2*p3)+...-N/(p1*p2*p3)-......+1/(p1*p2*p3*p4)+.....
    而这个推导的公式就等于
    证毕。

     理解了上述证明公式,那么求解相关问题就会非常简单

    题目:873. 欧拉函数 - AcWing题库

    代码:

    1. #include
    2. #include
    3. #include
    4. using namespace std;
    5. const int N=105;
    6. int n,res[N];
    7. void get_primes(int u)
    8. {
    9. int cnt=0;
    10. //试除法求约数
    11. for(int i=2;i<=u/i;i++)
    12. {
    13. while(u%i==0)
    14. {
    15. u/=i;
    16. res[cnt]=i;
    17. cnt++;
    18. //以免多次储存。譬如8=2^3,如果不去重则会有:res[0]=2,res[1]=2,res[2]=2;
    19. if(u%i==0) cnt--;
    20. }
    21. }
    22. if(u>1) res[cnt]=u;
    23. }
    24. void euler(int a[],int u)
    25. {
    26. //记得开long long
    27. int ans=u;
    28. for(int i=0;a[i]!=0;i++)
    29. {
    30. //欧拉公式
    31. ans=ans/a[i]*(a[i]-1);
    32. }
    33. cout << ans << endl;
    34. }
    35. int main()
    36. {
    37. cin >> n;
    38. for(int i=0;i
    39. {
    40. int x;
    41. cin >> x;
    42. get_primes(x);
    43. euler(res,x);
    44. //每次计算完成一个数,就将res重置,以免与后续冲突
    45. memset(res,0,sizeof res);
    46. }
    47. return 0;
    48. }

     题目:874. 筛法求欧拉函数 - AcWing题库

     本题牵涉到两个公式的证明,在代码后会给出。和前面所学的线性筛,请及时回顾

    代码:

    1. #include
    2. #include
    3. #include
    4. using namespace std;
    5. const int N=1e6+10;
    6. int n,phi[N],primes[N],res;
    7. bool st[N];
    8. void get_eulers(int u)
    9. {
    10. //1特殊处理,当N等于1时,与1互质的个数为1
    11. phi[1]=1;
    12. for(int i=2;i<=u;i++)
    13. {
    14. if(!st[i])
    15. {
    16. primes[res++]=i;
    17. //当数x是质数时,那么与x在1~x互质的个数为x-1,譬如2,3,5,7...
    18. phi[i]=i-1;
    19. }
    20. for(int j=0;primes[j] <= u/i;j++)
    21. {
    22. //线性筛,筛去质数的倍数
    23. st[primes[j]*i]=true;
    24. //公式一与公式二都是对被筛去的数 求欧拉数
    25. if(i%primes[j]==0)
    26. {
    27. phi[i*primes[j]]=primes[j]*phi[i];//公式一
    28. break;
    29. }
    30. phi[i*primes[j]]=(primes[j]-1)*phi[i];//公式二
    31. }
    32. }
    33. long long cnt=0;
    34. for(int i=1;i<=u;i++) cnt+=phi[i];
    35. cout << cnt;
    36. }
    37. int main()
    38. {
    39. cin >> n;
    40. get_eulers(n);
    41. return 0;
    42. }

     公式一,若i%primes[j]==0,则有phi[i*primes[j]]=primes[j]*phi[i];这个因果关系的含义即为:
    如果一个数x是N的质因数y的倍数,那么x*y的欧拉函数就为x*(y的欧拉函数)
    证明:因为x%y==0,所以y是x的一个因数,又因为y是N的一个质因数(在筛质数的过程中是以质因数来筛的),那么y是x的质因数。根据算术基本定理 在这里,我们假设x=
     

    公式二:

     欧拉定理

  • 相关阅读:
    【EI会议2023】12.20之后ddl
    XPD977协议系列-支持 XPD-LINK™互联 USB 三端口控制器
    Google Earth Engine(GEE)——如何创建一个属性给feature Collection使其图形加载过程中可以出现名称
    Web篇_01 了解web开发
    什么是BeanDefination
    面向对象的设计-设计模式-5种创建型模式
    基础设施即代码(IAC),Zalando Postgres Operator UI 入门
    wangEditor小插件快捷开发
    06 数组
    Linux安装RabbitMQ步骤分享
  • 原文地址:https://blog.csdn.net/2301_80358171/article/details/140401683