数论培训day 2下午【数论】
逆元
欧拉定理的证明
线性求逆元
解决这样只要前面求出(p mod i)的逆元就能求出i的逆元
练习
解决
前面的算法在这道题面前一点用不管,只能用暴力,但是可以用BSGS算法优化暴力
代码实现
int size;
bool erfen(int x)
{
int l=0,r=size;
while (l+1!=r)
{
int m=(l+r)>>1;
if (z[m]>=x) r=m;
else l=m;
}
return z[r]==x;
}
int bsgs(int a,int b,int p)
{
size = sqrt(p);
int nowv=1;
for (int i=1;i<=size;i++)
{
nowv = (long long)nowv * a%p;
z[i] = nowv;
if (z[i] == b) return i;
}
sort(z+1,z+size+1);
for (int i=2;(i-1)*size+1 <= p;i++)
{
int y = (long long)b * kuaisumi(kuaisumi(a,size*(i-1),p),p-2,p);
if (erfen(y))
{
for (int j=(i-1)*size+1;j<=i*size;j++)
if (kuaisimi(a,j,p) == b) return j;
}
}
return -1;
}
积性函数
定义
常见积性函数
证明
不变函数 显然
欧拉函数
莫比乌斯函数
莫比乌斯反演
证明