我们来看一点清真的东西:
<关于逆元>
一. p特别小,b也特别小(即
p∗b<longint
)
(a/b)modp=amod(b∗p)/b;
二. p为质数
费马小定理
ap−2
是
a
的逆元
三. p不为质数
aϕ(p)−1
为
p
的逆元
1. 求一次
利用公式
ϕ(p)=p∗(p1−1/p1)∗(p2−1/p2)∗……∗(pi−1/pi);
其中
pi
为
p
的质因子。
2. 若
O(p)
线性筛
ϕ(1−p)
四.线性筛欧拉函数
在求解素数的同时求出欧拉函数。
利用性质:
1.p,q互质时:
ϕ(p∗q)=ϕ(p)∗ϕ(q);
2.p为素数:
ϕ(p)=p−1;
3.当p为素数,如果i % p = 0:
ϕ(i∗p)=ϕ(i)∗p
int p,cnt;
bool mark[MAXN];
int prime[MAXN],phi[MAXN];
int main()
{
scanf("%d",&p);
for(int i=2; i<=p; i++)
{
if(!mark[i])
{
prime[cnt++]=i;
phi[i]=i-1;
}
for(int j=0; j<cnt && prime[j]*i<=p; j++)
{
mark[i*prime[j]]=1;
if(!(i%prime[j]))
{
phi[i*prime[j]]=phi[i]*prime[j];
break;
}
else
phi[i*prime[j]]=phi[i]*(prime[j]-1);
/*phi[prime[j]]=prime[j]-1;*/
}
}
}
五.p为质数
ϕ(pk)=ϕ(p)∗pk−1=(p−1)∗pk−1;
六.
aϕ(p)modp=1
abmodp=abmodϕ(p)modp
七.Exgcd - 扩展gcd
a∗x=1(modb)
a∗x+b∗y=1;
a∗x+b∗y=gcd(a,b)=gcd(b,amodb);
x=y′,y=x′−a/b∗y′;