唯一分解定理:合数N=
p
1
k
1
∗
p
2
k
2
∗
p
3
k
3
.
.
.
.
∗
p
k
k
k
p1^k1^*p2^k2^*p3^k3^....*pk^kk
p1k1∗p2k2∗p3k3....∗pkkk
欧拉函数:找到
1
−
N
中
与
N
互
质
的
数
,
(
1
与
任
何
数
互
质
)
1-N中与N互质的数,(1与任何数互质)
1−N中与N互质的数,(1与任何数互质)
ϕ
(
N
)
=
N
×
(
p
1
−
1
/
p
1
)
×
(
p
2
−
1
/
p
2
)
×
…
×
(
p
m
−
1
/
p
m
)
ϕ(N) = N×(p1−1/p1)×(p2−1/p2)×…×(pm−1/pm)
ϕ(N)=N×(p1−1/p1)×(p2−1/p2)×…×(pm−1/pm)=N
×
\times
×
(
1
−
1
/
p
1
)
(1-1/p1)
(1−1/p1)
×
\times
×
(
1
−
1
/
p
2
)
(1-1/p2)
(1−1/p2)…
(
1
−
1
/
p
k
)
(1-1/pk)
(1−1/pk)
时间复杂度:
O
(
n
)
O(\sqrt[]n)
O(n)
#include<bits/stdc++.h>
using namespace std;
const int N=1e5;
int main()
{
int t;
cin>>t;
while(t--)
{
int a;
cin>>a;
int res=a;
for(int i=2;i<=a/i;i++)
{
if(a%i==0)
{
while(a%i==0) a/=i;
res=res/i*(i-1);
}
}
if(a>1) res=res/a*(a-1);
cout<<res<<endl;
}
}
利用欧拉筛求欧拉函数之和
时间复杂度:
O
(
n
)
O(n)
O(n)
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=1e6+10;
int prime[N];
bool f[N];
ll phi[N];
int n;
int cnt;
ll get_euler(int x)
{
f[1]=1;
phi[1]=1;
for(int i=2;i<=n;i++)
{
if(!f[i])
{
prime[cnt++]=i;
phi[i]=i-1;
}
for(int j=0;prime[j]<=n/i&&j<cnt;j++)
{
f[prime[j]*i]=1;
if(i%prime[j]==0)
{
phi[prime[j]*i]=phi[i]*prime[j];
break;
}
phi[prime[j]*i]=phi[i]*(prime[j]-1);
}
}
ll res=0;
for(int i=1;i<=n;i++)
{
res+=phi[i];
}
return res;
}
int main()
{
cin>>n;
cout<<get_euler(n)<<endl;
}
#include <bits/stdc++.h>
using namespace std;
int t,a,b;
int exgcd(int a,int b,int &x,int &y)
{
if(b==0)
{
x=1,y=0;
return a;
}
int d,x1,y1;
d=exgcd(b,a%b,x1,y1);
x=y1;
y=x1-a/b*y1;
return d;
}
int main()
{
scanf("%d",&t);
while(t--)
{
int a,b,m;
scanf("%d%d%d",&a,&b,&m);
int x,y;
int d=exgcd(a,-m,x,y);
if(b%d) cout<<"impossible\n";
else cout<<1LL*(b/d)*x%m<<endl;
}
}