欧拉函数:用来求1...n-1范围内与n互质的数的个数
phi(n) = n*(1 - 1/p1)*(1 - 1/p2)*...*(1 - 1/pk) (p1, p2, ... pk为n的质因子)
因为 n = p1q1 * p2q2 * ... * pkqk
带入得:phi(n) = (p1 - 1)*p1q1-1 * (p2 - 1)*p2q2-1 * ... * (pk - 1)*pkqk-1;
代码:
int eular(int n) { int i, res = 1; for(i = 2; i*i <= n; ++i) { if(n%i == 0) { n /= i; res *= i - 1; while(n%i == 0) { n /= i; res *= i; } } } if(n > 1) res *= n - 1; return res; }
欧拉函数打表:
int Eu[N]; void init() { int i, j; for(i = 1; i < N; ++i) Eu[i] = i; for(i = 2; i < N; ++i) { if(Eu[i] == i) { for(j = i; j < N; j += i) { Eu[j] = Eu[j]/i*(i - 1); } } } }