Farey Sequence
Time Limit: 1000MS | Memory Limit: 65536K | |
Total Submissions: 17399 | Accepted: 6980 |
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.
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
欧拉函数模板
欧拉函数的三个性质
1 当q为质数时f(q)=q-1
2 如果i/p是p的倍数时f(i)=f(i/p)*p
3 如果i/p不是p的倍数时f(i)=f(i/p)*(p-1)
#include<iostream>
#include<cstdio>
#include<cstring>
#define N 1000500
using namespace std;
long long a[N],res[N],f[N],prime[N];
int n,tot;
void init()
{
tot=0;
memset(a,0,sizeof(a));
memset(f,0,sizeof(f));
memset(res,0,sizeof(res));
n=1000010;
}
void getprime()
{
for (int i=2;i<=n;i++)
{
if (!a[i])
{
a[i]=i;//a数组存的是最小质因子,如果为0就是质数
prime[tot++]=i;
}
for (int j=0;j<tot && i*prime[j]<=n;j++)
{
a[i*prime[j]]=prime[j];
if (i%prime[j] == 0) break;
}
}
}
void getphi()
{
f[1]=1;
for (int i=2;i<=n;i++)
{
if (a[i/a[i]] == a[i]) f[i]=f[i/a[i]]*a[i];//性质2
else f[i]=f[i/a[i]]*(a[i]-1);//性质3
}
}
int main()
{
init();
getprime();
getphi();
for (int i=2;i<=n;i++)
res[i]=res[i-1]+f[i];
while(cin>>n && n) cout<<res[n]<<endl;
return 0;
}