欧拉函数:修订间差异
跳转到导航
跳转到搜索
创建页面,内容为“==线性筛求欧拉函数== <syntaxhighlight lang="cpp" line> const int MAXN = 40000; bool p[MAXN + 5]; int phi[MAXN + 5]; vector<int> pri; // 筛出 1~n 中的每个数是否为质数 // 顺带求出所有欧拉函数 void get_primes(int n) { for (int i = 1; i <= n; i++) p[i] = true; p[0] = p[1] = false; phi[1] = 1; for (int i = 2; i <= n; i++) { if (p[i]) { pri.push_back(i); phi[i] = i - 1;…” |
无编辑摘要 |
||
| 第1行: | 第1行: | ||
==求单个欧拉函数== | |||
<syntaxhighlight lang="cpp" line> | |||
int phi(int n) | |||
{ | |||
int ans = n; | |||
for (int i = 2; 1LL * i * i <= m; i++) | |||
if (n % i == 0) | |||
{ | |||
ans = ans / i * (i - 1); | |||
while (n % i == 0) | |||
n /= i; | |||
} | |||
if (n > 1) | |||
ans = ans / n * (n - 1); | |||
return ans; | |||
} | |||
</syntaxhighlight> | |||
==线性筛求欧拉函数== | ==线性筛求欧拉函数== | ||
2026年2月26日 (四) 02:25的版本
求单个欧拉函数
int phi(int n)
{
int ans = n;
for (int i = 2; 1LL * i * i <= m; i++)
if (n % i == 0)
{
ans = ans / i * (i - 1);
while (n % i == 0)
n /= i;
}
if (n > 1)
ans = ans / n * (n - 1);
return ans;
}
线性筛求欧拉函数
const int MAXN = 40000;
bool p[MAXN + 5];
int phi[MAXN + 5];
vector<int> pri;
// 筛出 1~n 中的每个数是否为质数
// 顺带求出所有欧拉函数
void get_primes(int n)
{
for (int i = 1; i <= n; i++)
p[i] = true;
p[0] = p[1] = false;
phi[1] = 1;
for (int i = 2; i <= n; i++)
{
if (p[i])
{
pri.push_back(i);
phi[i] = i - 1;
}
for (int j = 0; j < pri.size(); j++)
{
// i*pri[j]
if (1LL * i * pri[j] > n)
break;
p[i * pri[j]] = false;
if (i % pri[j] == 0)
{
phi[i * pri[j]] = phi[i] * pri[j];
break;
}
else
phi[i * pri[j]] = phi[i] * (pri[j] - 1);
}
}
}