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
23450
Sample Output
1359
題目大意就是求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
參考代碼:
#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;
}