码迷,mamicode.com
首页 > 其他好文 > 详细

POJ - 2478 Farey Sequence(phi打表)

时间:2016-08-19 11:27:43      阅读:136      评论:0      收藏:0      [点我收藏+]

标签:

题目:

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 <= 10 6). 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

这个题目无非就是求欧拉函数的前n项和呗

因为查询不知道有多少个,所以要先打表。

代码:

#include<iostream>
#include<stdio.h>
using namespace std;

long long phi[1000001];		//前i个数的phi之和

void get_phi()
{
	for (int i = 1; i <= 1000000; i++)phi[i] = i;
	for (int i = 2; i <= 1000000; i++)
	{
	if (phi[i] == i)for (int j = i; j <= 1000000; j += i)phi[j] = phi[j] / i*(i - 1);
	phi[i] += phi[i - 1];	//去掉这一行就是求欧拉函数
	}
}

int main()
{
	get_phi();
	int n;
	while (scanf("%d",&n))
	{
		if (n == 0)break;
		printf("%llu\n", phi[n] - 1);
	}
	return 0;
}

POJ - 2478 Farey Sequence(phi打表)

标签:

原文地址:http://blog.csdn.net/nameofcsdn/article/details/52248659

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!