POJ 2478 Farey Sequence

题意

介绍性的问题,法雷级数(Wikipedia::法里數列 可能需要科学上网)

简单暴力,给出一个n,求出对于1~n中每一个数,有多少个小于等于他的数与他互质,把这些数量加在一起是多少,其实就是求欧拉函数的前缀和。

思路

欧拉函数有两种得到的方法,一是使用分解因子的方法,得到单个数的欧拉函数值,时间复杂度O(sqrt(n) * log(n))。如下:

可以发现这样算的话如果只求一个数的欧拉函数还是不亏的,但是如果要求非常非常多的欧拉函数,时间就会爆炸,所以我们不可以在这个题用这种方法。

第二种方法是利用欧拉函数的若干性质: 欧拉函数线性筛法详解(Lytning),然后把素数的线性筛法和求欧拉函数结合到一起,如果要求非常多的欧拉函数,使用这种方法预处理是非常快的,而且还顺便求了素数,一石二鸟。

快速地得到欧拉函数值之后,前缀和什么的就是很简单的事情了。

代码

 

1 Comment

  1. […] 然而这个题的精髓并不是这么水过去的,这个题其实是一个包装过了的法雷级数(Wikipedia::法里数列 可能需要科学上网),如果试着一圈圈地写一下斜率,就会发现每一圈正好满足分子和分母互质的特性,每一圈的个数其实是欧拉函数值,整个答案是欧拉函数前缀和。所以我们就有了O(n),的处理方法,详细的可以看这个题POJ 2478 Farey Sequence。 […]

    Reply

Leave a Reply

Scroll to top