Stern-Brocot Tree
思路
欧拉函数
法雷数列中所有的都是真分数分子分母互质并且以n为分母的分数有oula[n]个即欧拉函数。
代码:
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
bool prime_table[1000005];
int prime[1000005];
LL oula[1000005];
class memo
{
public:
memo()
{
memset(prime_table,0,sizeof(prime_table));
for(int i = 0;i <= 1000000;i++)
oula[i] = i;
}
void table();
void slove(int c);
};
void memo::slove(int c)
{
int n;
n = c;
printf("%lld\n",(LL)2*oula[n] + 1LL);
}
void memo::table()
{
for(int i = 2;i <= 10000;i++)
{
if(!prime_table[i])
{
for(int j = i;(i*j) <= 1000000;j++)
prime_table[i*j] = true;
}
}
int cn = 0;
for(int i = 2;i <= 1000000;i++)
if(!prime_table[i])
prime[cn++] = i;
for(int i = 0;i < cn;i++)
{
for(int j = 1;prime[i]*j <= 1000000;j++)
{
oula[prime[i]*j]/=(LL)prime[i];
oula[prime[i]*j]*=(LL)prime[i] - 1;
}
}
for(int i = 2;i <= 1000000;i++)
oula[i] += oula[i-1];
}
int main(void)
{
memo T;
T.table();
int c;
while(scanf("%d",&c)!=EOF)
{
T.slove(c);
}
return 0;
}