尤拉函式 簡單說明和打表的板子
阿新 • • 發佈:2019-02-02
(2)尤拉函式:說白了,就是指一個數n在[1,n-1]區間有多少個數與它互質(和容斥原理一樣的應用)。
比如說,euler[n] = m代表的意思是在區間[1,n-1]裡面有m個數與n互質。
尤拉函式公式:(我們假設n的質因子有x,y) euler[n] = n * (1-1/x) * (1-1/y)。若有多個繼續添上即可。
尤拉函式拓展:小於或等於n的數中(n > 1),與n互質的數的總和為:euler[n] * n / 2。
現給個例項:求區間[1,100]內所有數的尤拉函式。這裡eu[1] = 1。我不知道會不會有一些題目eu[1] = 0。。。注意啊
求尤拉函式 有兩個思路:
1, 篩素數打表,用陣列記錄每個數的尤拉函式(適用於n不是很大的情況,因為陣列不能開無限大);
2, 直接求法計算單個尤拉函式,對於有些題目會比較慢(對於很大的n依然可以求解)。
#include <cstdio>
#include <cstring>
#define MAX 100+1
int eu[MAX];
void euler()
{
int i, j;
eu[1] = 1;//1的尤拉函式為1 看題目而定
for(i = 2; i < MAX; i++)
{
if(!eu[i])
{
for(j = i; j < MAX; j += i)
{
if (!eu[j]) eu[j] = j;
eu[j] = eu[j] * (i-1) / i;
}
}
}
}
int main()
{
euler();
for(int i = 1; i < MAX; i++)
printf("%d\n", eu[i]);
return 0;
}