数论--欧拉函数
欧拉函数
计算与n互质的正整数个数
线性求eular
bool prime[maxn]; //素数
vector<int> v;
int f[maxn]; //欧拉函数
void euler(int n)
{
mem(prime,1);
for(int i = 2; i < n; i++)
{
if(prime[i]) v.push_back(i),f[i] = i-1;
for(auto j : v)
{
if(i*j >= n) break;
prime[i*j] = 0;
if(i%j) //根据当前素数(j)是否为i的素因子,分情况计算欧拉函数
f[i*j] = f[i]*(j-1);
else //i是j的倍数
{
f[i*j] = f[i]*j;
break;
}
}
}
}
直接求euler
int euler(int n)
{
int ret = 1, i;
for (i = 2; i * i <= n; i++)
{
if (n % i == 0)
{
n /= i;
ret *= i - 1;
while (n % i == 0)
{
n /= i;
ret *= i;
}
}
}
if (n > 1)
ret *= n - 1;
return ret;
}