欧拉函数求互质对数
欧拉函数:
直接上代码
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
int oular(int n)
{
int ans=n;
for(int i=2;i*i<=n;i++)
{
if(ans%i==0)
{
ans=ans-ans/i;
while(n%i==0)
{
n/=i;
}
}
}
if(n>1)
{
ans=ans-ans/n;
}
return ans;
}
int main()
{
int n;
while(~scanf("%d",&n))
{
printf("%d\n",oular(n));
}
return 0;
}
欧拉函数素数筛(暂未理解)
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
const int MAX_N = 1e5 + 7;
int primes, prime[MAX_N], phi[MAX_N];
bool com[MAX_N];
void get_prime_phi(int N)
{
memset( com, false, sizeof( com ) );
primes = 0;
phi[1] = 1;
for (int i = 2; i <= N; ++i)
{
if (!com[i])
{
prime[primes++] = i;
phi[i] = i-1;
}
for (int j = 0; j < primes && i*prime[j] <= N; ++j)
{
com[i*prime[j]] = true;
if (i % prime[j])
phi[i*prime[j]] = phi[i]*(prime[j]-1);
else
{
phi[i*prime[j]] = phi[i]*prime[j];
break;
}
}
}
}
int main()
{
int n;
while(cin>>n)
{
get_prime_phi(n);
for(int i=1;i<=n;i++)
{
cout<<phi[i]<<" ";
}
cout<<endl;
}
return 0;
}
欧拉降幂
欧拉降幂公式:
用这个公式再加上上面的欧拉函数求法,就能写出来了。
扩展:如果a>sqrt(n),那么n/a<sqrt(n),如果n/a是个整数,则n%a=0,且由于n/a<sqrt(n),因此n/a已经先跑了,就没必要再跑a了。(素数)