1. 程式人生 > >尤拉函式 簡單說明和打表的板子

尤拉函式 簡單說明和打表的板子

(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; }