费马小定理:
欧拉定理:
若正整数 a , n 互质,则 aφ(n)≡1(mod n) 其中 φ(n) 是欧拉函数(1~n) 与 n 互质的数。
费马小定理:
对于质数p,任意整数a,均满足:a的p次幂≡a(mod p)
欧拉定理的推论:
若正整数a,n互质,那么对于任意正整数b,有a的b次幂≡a的b mod φ(n)次幂(mod n)
(因为mod是质数,那么φ(mod)= mod-1)
快速幂:
int quick(int a,int b,int c)
{
int ans=1; //记录结果
a=a%c; //预处理,使得a处于c的数据范围之下
while(b!=0)
{
if(b&1) ans=(ans*a)%c; //如果b的二进制位不是0,那么我们的结果是要参与运算的
b>>=1; //二进制的移位操作,相当于每次除以2,用二进制看,就是我们不断的遍历b的二进制位
a=(a*a)%c; //不断的加倍
}
return ans;
}
其中a和m要保证是互质,首先要保证最大公约数为1。更多的是下面的模板:
ll exgcd(ll a,ll b,ll &x,ll &y)//扩展欧几里得算法
{
if(b==0)
{
x=1;
y=0;
return a; //到达递归边界开始向上一层返回
}
ll gcd=exgcd(b,a%b,x,y);
ll y1=y; //把x y变成上一层的
ll x1=x;
y=x1-(a/b)*y1;
x=y1;
return gcd; //得到a b的最大公因数
}
ll inv(ll a,ll mod){
ll x,y;
ll gcd=exgcd(a,mod,x,y);
if(gcd!=1)return -1;
else return (x+mod)%mod;
}
ll inv6=inv(6,mod);//求6的逆元,求其他数的逆元同理