Farey Sequence 法里序列(基本数论/欧拉函数/欧拉筛)

文章介绍了如何使用欧拉函数的前缀和来计算Farey序列Fn中的项数。给定正整数n,程序初始化欧拉函数并计算其前缀和,然后根据输入的n值输出Farey序列的项数。这是一个涉及数论和算法的编程问题。
摘要由CSDN通过智能技术生成

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

思路:欧拉函数的前缀和,关于欧拉函数详见文章:浅谈欧拉函数

AC代码:

#include<cstdio>
#include<iostream>
#define int long long
using namespace std;

const int N=1000005;
int phi[N],num[N],sum[N];
bool isnp[N];
void euler(int n){
	int ant=0;
	phi[1]=1;
	for(int i=2;i<=n;i++){
		if(!isnp[i]){
			num[++ant]=i;
			phi[i]=i-1;
		}
		for(int j=1;j<=ant&&i*num[j]<=n;j++){
			isnp[i*num[j]]=1;
			if(i%num[j]==0){
				phi[i*num[j]]=phi[i]*num[j];
				break;
			}
			phi[i*num[j]]=phi[i]*phi[num[j]];
		}
	}
}
signed main(){
	//注意!!!一定要减 否则数组会溢出!!! 
	euler(N-5);//初始化 求前1000000个数的欧拉函数 
	//求前缀和 
	for(int i=2;i<=N-5;i++){
		sum[i]=sum[i-1]+phi[i];
	}
	int n;
	while(cin>>n){
		//多组输入以0结束的题目一定要这样写!!! 
		if(n==0){
			break;
		}
		cout<<sum[n]<<endl;
	}
	
	return 0;
}

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

古谷彻

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值