关闭

POJ 2478 Farey Sequence 欧拉函数

标签: 欧拉函数
249人阅读 评论(0) 收藏 举报
分类:

Farey Sequence
Time Limit: 1000MS   Memory Limit: 65536K
Total Submissions: 15235   Accepted: 6051

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. The first few are 
F2 = {1/2} 
F3 = {1/3, 1/2, 2/3} 
F4 = {1/4, 1/3, 1/2, 2/3, 3/4} 
F5 = {1/5, 1/4, 1/3, 2/5, 1/2, 3/5, 2/3, 3/4, 4/5} 

You task is to calculate the number of terms in the Farey sequence Fn.

Input

There are several test cases. Each test case has only one line, which contains a positive integer n (2 <= n <= 106). There are no blank lines between cases. A line with a single 0 terminates the input.

Output

For each test case, you should output one line, which contains N(n) ---- the number of terms in the Farey sequence Fn. 

Sample Input

2
3
4
5
0

Sample Output

1
3
5
9

Source

POJ Contest,Author:Mathematica@ZSU


    题意:该题可以转化成欧拉函数的连续值。

    分析:如果每次调用欧拉函数肯定会超时,可以转化成一个思路。在此代码借鉴了网上的代码,有详细的备注。代码主要运用了欧拉函数的一些性质进行优化。欧拉函数性质参见:http://blog.csdn.net/qq_26071477/article/details/52356066 见代码:

//求取大范围的连续整数的欧拉函数值 使用  避免每次调用欧拉函数重复调用
//普通求取欧拉函数的求法 在于求取每个数都调用了欧拉函数
//改进后的算法在于  保留了过程  在前面计算的基础上求出后面的值
#include <stdio.h>
const int  maxn=1000005 ;
int phi[maxn],prime[100000];//phi 表示欧拉函数值 
bool unprime[maxn];
long long sum[maxn];
void euler()
{
	int k;
	for(int i=2,k=0; i<maxn; i++)
	{
		if(!unprime[i])// 是质数的话
		{
			//	printf("%d ",i);
			prime[k++]=i; //质数数组添加一个质数
			phi[i]=i-1;//质数的欧拉函数值 是i-1
		}
		for(int j=0; j<k&&prime[j]*i<maxn; j++)//j表示的是质数数组的下标
		{
			//任何非负整数都存在质因子  任何整数都是一个质数或者非质数 乘以一个质因子得到  例如8 = 4*2
			//这里即可将所有非质数标记为真  质因子判断法
			//求出的素数和每个已求得的素数相乘得到非素数的欧拉函数值         充分利用此性质
			//素数本身的欧拉函数值可以直接减一得到
			unprime[prime[j]*i]=true; //质数和质数相乘得到的数 不再是质数
			/*在这里需要利用两个性质。第一,大于1的质数x的欧拉函数值为x-1,1的欧拉函数值为1。
			第二,若a为N的质因数,若(N % a == 0 && (N / a) % a == 0) 则有E(N)=E(N / a) * a;
			若(N % a == 0 && (N / a) % a != 0) 则有:E(N) = E(N / a) * (a - 1)。*/
			if(i%prime[j]) //根据欧拉函数性质
				phi[prime[j]*i]=phi[i]*(prime[j]-1);
			else
			{
				phi[prime[j]*i]=phi[i]*prime[j];
				break;//再扩大则是上述情况  此情况是指数较小的情况
			}
		}
	}
}
int main()
{
	int n;
	euler();
	for(int i=1; i<maxn; i++)
		sum[i]=sum[i-1]+phi[i];
	while(scanf("%d",&n)&&n)
		printf("%lld\n",sum[n]);
}

    刷题长见识……

    特记下,以备后日回顾。

0
0
查看评论

POJ2478 Farey Sequence

#include #include #define maxn 1000001 int phi[maxn]; void p() { memset(phi,0,sizeof(phi)); for(int i=2;i<maxn;i++) { if(!phi[i]) for(int j...
  • xuyouqiao2005
  • xuyouqiao2005
  • 2014-07-25 17:11
  • 230

POJ2478 Farey Sequence,欧拉函数

挺不错的数论题。 给定一个数n,求在[1,n]这个范围内两两互质的组合数。则问题可以转化为给定一个数n,比n小且与n互质的数的个数。这个就是典型的欧拉函数问题了。 关于欧拉函数可以看这里:http://blog.csdn.net/leolin_/article/details/6642096&#...
  • neofung
  • neofung
  • 2012-07-17 18:54
  • 2940

poj 2478 Farey Sequence(欧拉函数)

Farey Sequence Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 13204   Accepted: 5181 Description...
  • aaaaacmer
  • aaaaacmer
  • 2015-08-04 09:38
  • 682

POJ 2478 : Farey Sequence - 欧拉函数

题意:法雷级数由一系列不能约分的分数按递增顺序排列。计算Fn中有多少个分数。分析:一个法雷序列Fn中分数的个数,即 分别与2,3,4,5,...,n-1,n互素的数的个数和。亦即求从2到n连续的欧拉函数值的和。N是2~1000000的数,故可直接用欧拉函数的递推方法求解,打表预处理前n项即可。216...
  • Booky_Amnesia
  • Booky_Amnesia
  • 2015-01-10 21:44
  • 420

poj2478(欧拉函数)

题目大意:给定一个数n
  • wangzhuo0978
  • wangzhuo0978
  • 2016-03-06 21:06
  • 132

poj 2478 Farey Sequence (欧拉函数)

Description The Farey Sequence Fn for any integer n with n >= 2 is the set of irreducible rational numbers a/b with 0 F2 = {1/2} F3 = {1/3, 1/...
  • steamqueen
  • steamqueen
  • 2012-08-23 14:31
  • 942

POJ 2478 Farey Sequence(欧拉函数)

/*对于每一个输入的n,结果输出为 从2开始的欧拉函数值一直加到n的欧拉函数值, 为了对于不同的n,这个累加的过程不再重复, 我们将累加的结果存储在数组a之中*/ /*注意,由于是累加,因此累加后的结果很大,最终 要求的答案也可能很大,超出int的范围,因此要用long long*/ #...
  • Hot_Summer_Days
  • Hot_Summer_Days
  • 2014-07-26 12:01
  • 381

POJ - 2478 Farey Sequence (欧拉函数)

#include<cstdio> using namespace std; /* 欧拉函数n>=2 a/b(a<=a<b<=n&&gcd(a,b)==1) F2 = {1/2} F3 = {1/3, 1/2, 2/3} F4 = {1/4, 1/...
  • zhuxiyulu
  • zhuxiyulu
  • 2017-07-29 11:28
  • 56

2478 Farey Sequence //欧拉函数

Farey SequenceTime Limit: 1000MS Memory Limit: 65536KTotal Submissions: 7076 Accepted: 2610<br />DescriptionThe Farey Sequence Fn for ...
  • hqd_acm
  • hqd_acm
  • 2011-02-13 17:28
  • 538

poj2478【欧拉函数】

Language: Default Farey Sequence Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 14596   A...
  • R1986799047
  • R1986799047
  • 2016-06-23 18:38
  • 215
    个人资料
    • 访问:91090次
    • 积分:1966
    • 等级:
    • 排名:千里之外
    • 原创:109篇
    • 转载:8篇
    • 译文:0篇
    • 评论:9条
    最新评论