取模:
(a+b)%p = (a%p + b%p)%p
(a-b)%p = (a%p - b%p + p)%p
(a*b)%p = (a%p*b%p)%p
(a/b) %p = ?
逆元
逆元–>倒数(相乘=1)
1、
顺便在p为质数的时候,直接求a^(p-2)就ok
2、扩欧,先来说一下扩展欧几里得算法:
求解形如ax+by=gcd(a,b)的一组解
求法:
求逆元:
3、线性求逆元
这里板子题
欧拉定理:(记得longlong)
#include <cstdio>
#define LL long long
using namespace std;
LL a,b;
LL phi(LL n)
{
int ans=1;
for (int i=2;i*i<=n;i++)
if (n%i==0)
{
ans*=i-1; n/=i;
while(n%i==0) ans*=i,n/=i;
}
if (n>1) ans*=n-1;
return ans;
}
LL ksm(LL a,LL k)
{
LL ans=1;a%=b;
for (;k;k>>=1,a=a*a%b)
if (k&1) ans=ans%b*a%b;
return ans%b;
}
int main()
{
scanf("%lld%lld",&a,&b);
LL hh=phi(b)-1;
printf("%lld",ksm(a,hh));
}
扩欧:
#include <cstdio>
using namespace std;
void exgcd(int a,int b,int &x,int &y)
{
if (b==0)
{
x=1; y=0; return;
}
exgcd(b,a%b,y,x);
y-=a/b*x;
}
int main()
{
int x,y,a,b;
scanf("%d%d",&a,&b);
exgcd(a,b,x,y);
printf("%d",(x+b)%b);
}
线性求逆元Emmm….因为是线性的,所以对于这道板子来说数组并不能开下。
int inv[N];
void INV(int n,int p)
{
inv[0]=0;
inv[1]=1;
for (int i=2;i<=n;i++)
inv[i]=(p-(p/i))*inv[p%i]%p;
}