乘法逆元模板(Orz尧神)

相信我,如果你什么东西不会,什么东西不懂,什么东西不记得了,就去尧神模板里找,相信我,你一定能找到!

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cctype>
#include<cstdlib>
using namespace std;
#define ll long long

ll read(){
	ll x=0,y=1;char ch=getchar();
	while (isdigit(ch)){if (ch=='-')y=-1;ch=getchar();}
	while (!isdigit(ch)){x=(x<<1)+(x<<3)+ch-'0';ch=getchar();}
	return x*y;
}

//exgcd求逆元,要求a,b互质
ll exgcd(ll a,ll b,ll &x,ll &y){
	if (b==0){
		x=0,y=1;
		return a;
	}
	ll gcd=exgcd(b,a%b,x,y),tmp;
	tmp=x;
	x=y,y=tmp-a/b*y;
}

ll cal(ll a,ll b){
	ll x,y;
	ll gcd=exgcd(a,b,x,y);
	if (1%gcd!=0)	return -1;
	if (b<0)b=-1;
	x=(x%b+x)%b;
	while (!x)	x+=b;
	return x;
}
/*
利用费马小定理求逆元,当a,b互质,且b为质数时
由费马小定理得,a^(b-1)=1(mod b)
则有a*a^(b-2)=1(mod b)
那么a^(b-2)就是a在mod b意义下的逆元
*/

ll inv(ll a,ll b){
	ll ans=1;
	while (b){
		if (b&1)	ans*=a;
		a*=a;b>>=1;
	}
	return ans;
}

/*
线性递推求逆元,要求p为奇素数
设k=p%i,m=p/i,则有k+m*i=0(mod p)
则-m*i=k
两边同时除以k*i,有
-m*inv[k]=inv[i]
又有:(p-m)*inv[k]=m*inv[k](mod p)
则:inv[i]=(p-p/i)*inv[p%i]%p
*/
ll inv[1000010];
void getinv(){
	inv[1]=1;
	for (ll i=2;i<=n;i++)	inv[i]=(p-p/i)*inv[p%i]%p;
}