欧拉函数
1 //直接法,根据定义求解 欧拉函数,适用于求解少量 2 ll euler_direct(ll x) { 3 ll ans = x; 4 for (ll i = 2; i * i <= x; i++) { 5 if (x % i == 0) { 6 ans = ans / i * (i - 1); //使用定义式计算,先除后乘防止溢出 7 while (x % i == 0) x /= i; //除掉所有这个因子 8 } 9 } 10 //当剩余的 x 为质数的时候, e.g. 10带入算法 11 if (x > 1) ans = ans / x * (x - 1); 12 return ans; 13 } 14 15 16 //线性筛选法,适用于多求解多个数的欧拉函数 17 ll euler_table[maxn]; 18 19 void euler_filter() { 20 //每一个都初始化为n,相当于公式里面的n 21 for (int i = 2; i < maxn; i++) 22 euler_table[i] = i; 23 //筛法 24 for (ll i = 2; i < maxn; i++) { 25 if (euler_table[i] == i) //这一步保证 i 一定是质数 26 for (int j = i; j < maxn; j += i) //给所有公式中包含这个质数的项求解 27 euler_table[j] = euler_table[j] / i * (i - 1); 28 } 29 }