這個尤拉函式的**我調了半天,最後發現錯在乙個小細節上,直接當場崩潰。
所有的注釋都在**裡面,如果不懂的可以去別的地方看看原理。
模板如下:
#include
using
namespace std;
#define ll long long
#define inf 0x3f0x3f0x3f
#define max 1000000
ll phi[
max]
,primes[
max]
,primes2[
max]
;//phi是用來記錄每乙個數的尤拉函式值
//primes是用於記錄比n小的素數的值,實際上在本段**裡可有可無
//primes2是用於記錄可以由 n 分解出來的素數值
ll getpin
(ll n)
if(primes2[t]
)//如果這個素數是n的約數,就一定被記錄了,所以t加 1
++t;}}
ll sum=1;
for(
int i=
0;i)return sum;
//返回尤拉函式值
}int
main()
//常規的輸入輸出
下面在補充乙個尤拉函式的相關運用。
我們知道了尤拉函式的值後就相當於知道了小於n且與n互素的正整數的和。
這裡直接上公式:
s=n*f(n)/2
其中 f(n)表示n的尤拉函式值。
例如:與7互素的有1,2,3,4,5,6
/*一開始我不認為1與7互素,但看了看互素的定義後就信了
a1與a2互素:a1與a2的最大公約數為 1 。
所以1與7的最大公約數為1,它們互素。
/這幾個數的和為21=n/2f(7)=7/2f(7)=7/25=21。
相同的,如果知道了小於n且與n互素的正整數之和後,就可以求出小於n且與n非素數的正整數之和。具體怎麼操作我就不演示了,就是用總數-和就ac了。
尤拉函式(模板)
尤拉函式介紹 尤拉函式,在數論中用於求解 1 n 中與 n 互質數個數 的函式,因為研究者為尤拉,故命名為尤拉函式。通式 x x 1 1 p1 1 1 p2 1 1 p3 1 1 p4 1 1 pn 其中p1,p2 pn為x的所有質因數,x是不為0的整數。1 1 唯一和1互質的數 小於等於1 就是1...
尤拉函式模板
對正整數n,尤拉函式是少於或等於n的數中與n互質的數的數目。例如euler 8 4,因為1,3,5,7均和8互質。euler函式表達通式 euler x x 1 1 p1 1 1 p2 1 1 p3 1 1 p4 1 1 pn 其中p1,p2 pn為x的所有素因數,x是不為0的整數。euler 1 ...
尤拉函式模板
對正整數n,尤拉函式是少於或等於n的數中與n互質的數的數目。例如euler 8 4,因為1,3,5,7均和8互質。euler函式表達通式 euler x x 1 1 p1 1 1 p2 1 1 p3 1 1 p4 1 1 pn 其中p1,p2 pn為x的所有素因數,x是不為0的整數。euler 1 ...