求欧拉数模板
#include <bits/stdc++.h>
using namespace std;
int main()
{
int n;
cin >> n;
while (n--)
{
int a;
cin >> a;
int res = a;
for (int i = 2; i <= a / i; i++)
{
if (a % i == 0)
{
res = res / i * (i - 1); //注意这里要对公式进行一定的化简,保证公式中没有分数
while (a % i == 0)
a = a / i;
}
}
if (a > 1)
res = res / a * (a - 1);
cout << res << endl;
}
return 0;
}
筛选欧拉
#include<bits/stdc++.h>
using namespace std;
const int N=1e6+10;
typedef long long LL;
int phi[N],primes[N],cnt;
bool st[N];
LL get(int n)
{
phi[1]=1;
for(int i=2;i<=n;i++)
{
if(!st[i])
{
primes[cnt++]=i;
phi[i]=i-1;
}
for(int j=0;primes[j]<=n/i;j++)
{
st[primes[j]*i]=1;
if(i%primes[j]==0)
{
phi[primes[j]*i]=phi[i]*primes[j];
break;
}
phi[primes[j]*i]=phi[i]*(primes[j]-1);
}
}
LL res=0;
for(int i=1;i<=n;i++)
{
res+=phi[i];
}
return res;
}
int main()
{
int m;
cin>>m;
cout<<get(m)<<endl;
return 0;
}
欧拉函数用处
写几个重要的定理
首先同余:两个整数a、b,若它们除以整数m所得的余数相等,则称a与b对于模m同余或a同余于b模m。记作:a≡b (mod m)。
欧拉定理:如果a与n互质,则aφ(n)≡1 (mod n)
费马小定理:在欧拉定理的基础之上,如果n是一个质数记为p,则有aφ§≡1 (mod p),进而可以得到ap-1≡1 (mod p)