欧拉函数题集

来源:互联网 发布:java中的多态 编辑:程序博客网 时间:2024/06/05 07:15

【定义】

在数论,对正整数n,欧拉函数是少于或等于n的数中与n互质的数的数目。此函数以其首名研究者欧拉命名,它又称为Euler's totient function、φ函数、欧拉商数等。 例如φ(8)=4,因为1,3,5,7均和8互质。 从欧拉函数引伸出来在环论方面的事实和拉格朗日定理构成了欧拉定理的证明。φ函数的值 

通式:φ(x)=x(1-1/p1)(1-1/p2)(1-1/p3)(1-1/p4)…..(1-1/pn),其中p1, p2……pn为x的所有质因数,x是不为0的整数。φ(1)=1(唯一和1互质的数(小于等于1)就是1本身)。 (注意:每种质因数只一个。比如12=2*2*3那么φ(12)=12*(1-1/2)*(1-1/3)=4

若n是质数p的k次幂,φ(n)=p^k-p^(k-1)=(p-1)p^(k-1),因为除了p的倍数外,其他数都跟n互质。

【题集】

【HUD 1286】(入门题)

【HDU 2588】

【HDU 2824 The Euler function】(欧拉函数的初始化,有时间可以再做做,边判断数字i是否为素数,边计算)

【HDU 4983】(较难的,有一个做法比较神奇,用map优化)

<span style="font-size:14px;">map<int,int> mp;int phi(int n){int i,mul,nn;  if (n==1) return 1;  if (mp.find(n)!=mp.end()) return mp[n];  for (i=2;i*i<=n;i++)  {  if (n%i==0)    {    nn=n;      nn/=i;      mul=(i-1);      while (nn%i==0)      {        nn/=i;        mul*=i;      }      mp[n]=phi(nn)*mul;      return phi(nn)*mul;    }  }  mp[n]=n-1;  return n-1;}//main()函数里面不要忘了mp.clear(); </span>

【FZU 1969 GCD Extreme】 

UVA 11424 GCD - Extreme (I)  UVA 11426 GCD - Extreme (II)这三个是同一个题目,在uva上提交时要用long  long

求s(n)

s(n) = sum(gcd(m,i)(i<m))  (1<=m<=n)

预处理出s(n),然后调用

令s(n) = f(1) + f(2) + f(3) + …… f(n)

g[ x ] 表示gcd( x , k ) = i的个数

因为x/i 与 k/i一定互质

所以g[ x ] = phi(x/i)

#include <iostream>#include <algorithm>#include <cstdio>#include <cstring>#include <string>using namespace std;#define inf 1000005#define ll __int64int p[inf];ll f[inf], sum[inf];void is_prime(){memset(p, 0, sizeof(p));p[1] = 1;for(int i = 2; i < inf; i++){if(p[i] == 0){for(int j = i; j < inf; j+=i){if(p[j] == 0) p[j] = j;p[j] = p[j]/i*(i-1);}}}}int main(){is_prime();memset(f, 0, sizeof(f));f[1] = 0;for(int i = 1; i < inf; i++){for(int j  = 2*i; j < inf; j+=i){f[j] += (ll)p[j/i]*i;}}sum[1] = 0;for(int i = 2; i < inf; i++) sum[i] = sum[i-1] + f[i];int n;while(~scanf("%d", &n)){if(n == 0) break;printf("%I64d\n", sum[n]);}return 0;}


 


0 0
原创粉丝点击