• 欧拉函数入门


    欧拉函数:小于x的整数中与x互质的数的个数,一般用φ(x)表示,φ(1)=1

    计算公式:φ(x)=x*(1-1/p1)(1-1/p2)...(1-1/pn),其中x的所有素因子数分别为p1,p2,p3,...,pn.

    常用性质:1.对于素数p,φ(p) = p-1, φ(pk) = pk-pk-1

         2.当gcd(n,m) = 1时,φ(n*m) = φ(n) * φ(m).

    暴力求一个数n的φ(n)模板

     1 /* */
     2 #include <iostream>
     3 #include <cstdio>
     4 #include <cmath>
     5 #include <cstring>
     6 #include <string>
     7 using namespace std;
     8 
     9 //12==2*2*3;
    10 int phi(int n)
    11 {
    12     int m=sqrt(n)+0.5;
    13     int ans=n;
    14     for(int i=2;i<=m;i++)
    15     {
    16         if(n%i==0)
    17         {
    18             ans=ans/i*(i-1);//即为ans*(1-1/i)
    19             while( n%i==0 ) n/=i;//去重
    20         }
    21     }
    22     if( n>1 ) ans=ans/n*(n-1);
    23     return ans;
    24 }
    25 
    26 int main()
    27 {
    28     int t;
    29     scanf("%d",&t);
    30     printf("%d
    ", phi(t));
    31     return 0;
    32 }

    打表法:

     1 /* */
     2 #include <iostream>
     3 #include <cstdio>
     4 #include <cmath>
     5 #include <cstring>
     6 #include <string>
     7 using namespace std;
     8 const int maxn=1000;
     9 int phi[maxn+10];
    10 
    11 void phi_init()
    12 {
    13     memset(phi,0,sizeof(phi));
    14     phi[1]=1;
    15     for(int i=2; i<=maxn; i++ )
    16     {
    17         if( !phi[i] )
    18         {
    19             for(int j=i; j<=maxn; j+=i )
    20             {
    21                 if( !phi[j] ) phi[j]=j;
    22                 phi[j]=phi[j]/i*(i-1);
    23             }
    24         }
    25     }
    26 }
    27 
    28 int main()
    29 {
    30     phi_init();
    31     for(int i=0; i<=10; i++ ) cout<<phi[i]<<" "<<endl;
    32     return 0;
    33 }

    例题:Mathematically Hard

     AC代码,由于数比较大记得用ull

     1 /* */
     2 #include <iostream>
     3 #include <cstdio>
     4 #include <cmath>
     5 #include <cstring>
     6 #include <string>
     7 using namespace std;
     8 const int maxn=5000010;
     9 typedef unsigned long long ull;
    10 ull phi[maxn+10];
    11 
    12 void phi_init()
    13 {
    14     memset(phi,0,sizeof(phi));
    15     phi[1]=1;
    16     for(int i=2; i<maxn; i++ )
    17     {
    18         if( !phi[i] )
    19         {
    20             for(int j=i; j<maxn; j+=i )
    21             {
    22                 if( !phi[j] ) phi[j]=j;
    23                 phi[j]=phi[j]/i*(i-1);
    24             }
    25         }
    26     }
    27 }
    28 
    29 void init()
    30 {
    31     ull temp=0;
    32     int i;
    33     phi[0]=0;
    34     for(i=1; i<maxn; i++ )
    35     {
    36         temp += phi[i]*phi[i];
    37         phi[i]=temp;
    38     }
    39 }
    40 
    41 int main()
    42 {
    43     int t, top=0, a, b;
    44     scanf("%d",&t);
    45     phi_init();
    46     init();
    47     while( t-- )
    48     {
    49         scanf("%d %d",&a,&b);
    50         printf("Case %d: %llu
    ", ++top, phi[b]-phi[a-1]);
    51     }
    52     return 0;
    53 }
    View Code
  • 相关阅读:
    编写属于自己的Linux Service命令
    Cloudera Manager和CDH4.1的安装
    html5基础教程收集整理精华
    Javascript跳转页面和打开新窗口等方法
    VK值列表
    标准C++之fstream
    PeekMessage用法
    Web系统常用测试方法
    VC控件的一些原理
    Visual C++ 文件操作
  • 原文地址:https://www.cnblogs.com/wsy107316/p/11600214.html
Copyright © 2020-2023  润新知