【poj2478-Farey Sequence】递推求欧拉函数-欧拉函数的几个性质和推论

http://poj.org/problem?id=2478

题意:给定一个数x,求<=x的数的欧拉函数值的和。(x<=10^6)

题解:数据范围比较大,像poj1248一样的做法是不可行的了。

首先我们要了解欧拉函数的几个性质和推论:(今天跟好基友Konjak魔芋讨论了好久。。)

推论(一): phi(p^k)=(p-1)*p^(k-1)

证明:

令n=p^k,小于等于n的正整数数中,所有p的倍数共有p^k /p = p^(k-1)个。

1~n出去p的倍数,所以phi(n)= n -  p^(k-1)  = p^k - p^(k-1) =  (p-1)*p^(k-1).得证。

引用自scy的讲解。

性质(一):若ab互质,则phi(a*b)=phi(a)*phi(b)。即:欧拉函数是积性函数.

证明:

对任意数n都可以唯一分解成n=p1^a1*p2^a2*p3^a3*...*pn^an(pi为素数).
            则E(n)=n*(1-1/p1)*(1-1/p2)*...*(1-1/pn)

=(p1^a1*p2^a2*p3^a3*...*pn^an)*[(p1-1)*(p2-1)*(p3-1)*...*(pn-1)]/(p1*p2*p3*...*pn)

=(p1-1)*p1^(a1-1)*(p2-1)*p2^(a2-1)*...*(pn-1)*pn^(an-1)     ---(1)
            =E(p1^a1)*E(p2^a2)*E(p3^a3)*...*E(pn^an)

所以当ab互质的时候E(a*b)=E(a)*E(b)

注明:E()即是phi()。

推论(二):当b是质数,a%b==0,phi(a*b)=phi(a)*b

这个的证明可以代入到上面性质一的证明之中:

b=gcd(a,b),指数为q。

在(1)中,即E(a*b)中有(b-1)*b^(q-1)

若E(a*b)拆分为E(a)*E(b),则多乘了一次(b-1)*b^(-1),那么我们为了方程两边相等,得到了:

E(a*b)=E(a)*E(b)*b/(b-1)

因为b是素数,phi(b)=b-1

所以E(a*b)=E(a)*b。

推论(三): 当n为奇数时,E(2n)=E(n)

2是一个质数,n为奇数则一定与2互质,E(2n)=E(2)*E(n),其中E(2)=1。

推论(四): 当n是一个大于2的正整数时,E(n)是偶数

   若n是素数,则E(n)=n-1,又因为素数中偶数只有2,则n-1一定是偶数

若n是合数,则可以分解质因数,E(n)=E(p1)*E(p2)*…… 根据上一步的结论,E(n)一定是偶数。

有了上面的基础,我们就可以轻易地推出O(n)的方法解决这个问题了,也就是在欧拉筛中顺便更新欧拉函数值。

具体看代码吧,非常明白的了。

今天还做了几题欧拉函数的题,真是觉得自己不是完全懂欧拉函数的。现在把这道题学到的东西归纳一下,才发现一道代码这么短的题有这么多的知识。。

 1 #include<cstdio>
 2 #include<cstdlib>
 3 #include<cstring>
 4 #include<iostream>
 5 using namespace std;
 6
 7 typedef long long LL;
 8 const int Max=(int)1e6;
 9 const int N=Max+100;
10 LL pl;
11 LL p[N],phi[N],sum[N];
12 bool vis[N];
13
14 void eular()
15 {
16     memset(vis,0,sizeof(vis));
17     pl=0;
18     for(int i=2;i<=Max;i++)
19     {
20         if(!vis[i]) p[++pl]=i,phi[i]=i-1;
21         for(int j=1;j<=pl;j++)
22         {
23             if(i*p[j]>Max) break;
24             vis[i*p[j]]=1;
25             if((i%p[j])==0)
26             {
27                 phi[i*p[j]]=phi[i]*p[j];
28                 break;
29             }
30             else phi[i*p[j]]=phi[i]*(p[j]-1);
31         }
32     }
33 }
34
35 int main()
36 {
37     // freopen("a.in","r",stdin);
38     // freopen("a.out","w",stdout);
39     eular();
40     sum[2]=1;
41     for(LL i=3;i<=Max;i++) sum[i]=sum[i-1]+phi[i];
42     while(1)
43     {
44         LL x;
45         scanf("%I64d",&x);
46         if(!x) return 0;
47         printf("%I64d\n",sum[x]);
48     }
49     return 0;
50 }

时间: 2024-11-15 07:56:05

【poj2478-Farey Sequence】递推求欧拉函数-欧拉函数的几个性质和推论的相关文章

POJ 2478 Farey Sequence 筛选法求欧拉函数

题目来源:POJ 2478 Farey Sequence 题意:输入n 求 phi(2)+phi(3)+phi(4)+...+phi(n) 思路:用类似筛法的方式计算phi(1), phi(2), ..., phi(n) 再求前缀和 #include <cstdio> #include <cstring> #include <cmath> //欧拉phi函数 const int maxn = 1000010; typedef long long LL; int eule

递推求欧拉函数的最简单的详解

有以下的两条性质: if(gcd(i, prime[j]) == 1) phi[i * prime[j]] = phi[i] * phi[prime[j]]; //因为是积性函数.phi[prime[j]]其实就是prime[j]-1. else phi[i * prime[j]] = phi[i] * prime[j];  所以,可以模仿埃氏筛的方法,来进行递推,顺便同时求出素数表. F(i, 1, n) phi[i] = i; //相当于not_prime[]的作用 F(i, 1, n) {

POJ2478 Farey Sequence

Farey Sequence Time Limit: 1000MS   Memory Limit: 65536K       Description The Farey Sequence Fn for any integer n with n >= 2 is the set of irreducible rational numbers a/b with 0 < a < b <= n and gcd(a,b) = 1 arranged in increasing order. Th

递推求值【快速幂矩阵】

递推求值 描述 给你一个递推公式: f(x)=a*f(x-2)+b*f(x-1)+c 并给你f(1),f(2)的值,请求出f(n)的值,由于f(n)的值可能过大,求出f(n)对1000007取模后的值. 注意:-1对3取模后等于2   输入 第一行是一个整数T,表示测试数据的组数(T<=10000)随后每行有六个整数,分别表示f(1),f(2),a,b,c,n的值.其中0<=f(1),f(2)<100,-100<=a,b,c<=100,1<=n<=10000000

NYOJ-301递推求值

递推求值 时间限制:1000 ms  |  内存限制:65535 KB 难度:4 描述 给你一个递推公式: f(x)=a*f(x-2)+b*f(x-1)+c 并给你f(1),f(2)的值,请求出f(n)的值,由于f(n)的值可能过大,求出f(n)对1000007取模后的值. 注意:-1对3取模后等于2 输入 第一行是一个整数T,表示测试数据的组数(T<=10000)随后每行有六个整数,分别表示f(1),f(2),a,b,c,n的值.其中0<=f(1),f(2)<100,-100<=

NYOJ——301递推求值(矩阵快速幂)

递推求值 时间限制:1000 ms | 内存限制:65535 KB 难度:4 描述 给你一个递推公式: f(x)=a*f(x-2)+b*f(x-1)+c 并给你f(1),f(2)的值,请求出f(n)的值,由于f(n)的值可能过大,求出f(n)对1000007取模后的值. 注意:-1对3取模后等于2 输入 第一行是一个整数T,表示测试数据的组数(T<=10000) 随后每行有六个整数,分别表示f(1),f(2),a,b,c,n的值. 其中0<=f(1),f(2)<100,-100<=

poj-2478 Farey Sequence(dp,欧拉函数)

题目链接: Farey Sequence Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 14230   Accepted: 5624 Description The Farey Sequence Fn for any integer n with n >= 2 is the set of irreducible rational numbers a/b with 0 < a < b <= n and gcd

hdu-5496 Beauty of Sequence(递推)

题目链接: Beauty of Sequence Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Submission(s): 813    Accepted Submission(s): 379 Problem Description Sequence is beautiful and the beauty of an integer sequence is def

poj 2096 Collecting Bugs 【概率DP】【逆向递推求期望】

Collecting Bugs Time Limit: 10000MS   Memory Limit: 64000K Total Submissions: 3523   Accepted: 1740 Case Time Limit: 2000MS   Special Judge Description Ivan is fond of collecting. Unlike other people who collect post stamps, coins or other material s