永夜初晗凝碧天

本博客现已全部转移到新地址,欲获取更多精彩文章,请访问http://acshiryu.github.io/

导航

poj2478 又一欧拉公式的运用

Farey Sequence
Time Limit: 1000MS Memory Limit: 65536K
Total Submissions: 7881 Accepted: 2957

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

题目大意就是求Fi集合中元素的个数,其中Fi集合的元素满足下列条件

形如a/b,且0<a<b<=i, gcd(a,b)=1 

很明显,这题就是欧拉公式的运用,关于欧拉公式可查看下这篇文章

http://www.cnblogs.com/ACShiryu/archive/2011/08/04/poj2407.html

对于这题,可以先求出以每一个小于m的数为分母的数的个数,即也是与该数互素的数的个数,也就是求的phi[i];

然后再每一个phi都加起来

题目就是比较简单的欧拉运用,1A

http://www.cnblogs.com/ACShiryu/

参考代码:

#include<iostream>
#include
<cstdlib>
#include
<cstdio>
#include
<cstring>
#include
<algorithm>
#include
<cmath>
using namespace std;
int phi[1000005];
int main()
{
int i , j ;
memset ( phi ,
0 ,sizeof ( phi ) ) ;
for ( i = 2 ; i <= 1000000 ; i ++ )
{
//筛选求phi
if ( ! phi [i] )
{
for ( j = i ; j <= 1000000 ; j += i )
{
if ( ! phi [j] )
phi [j ]
= j ;
phi [j]
= phi [j] / i * ( i - 1 ) ;
}
}
}
int n ;
while ( cin >> n , n )
{
__int64 sum
= 0 ;
for ( i = 2 ; i <= n ; i ++ )
sum
+= phi [i] ;
cout
<<sum<<endl;
}
return 0;
}

posted on 2011-08-07 11:17  ACShiryu  阅读(1733)  评论(0编辑  收藏  举报