#include<bits/stdc++.h>
using namespace std;
//求逆元,方法是费马小定理,还有一种更快的线性算法
long long mod=1000000007L;
int pow_mod(int x,int y,int c){
if(y==0) return 1;
int q=pow_mod(x,y/2,c)%c;
if(y&1) return (q*q*x)%c;
else return (q*q)%c;
}
int ni1(int a,int b){
//a%b的逆
//已知费马小定理 a^(b-1)%b==1 b为素数
//那么 a^(b-2)*a%b==1 ,所以 a mod b的逆是a(b-2)
//因为求的是模几逆,肯定是,这样不容易溢出
return pow_mod(a,b-2,b);
}
//当然如果,就直接调用pow_mod
//如果求一堆数的逆,有一个线性算法更快,根据递推式.png
int inv[10001],sum=1000;
void ni2(int p){
inv[1]=1;
for(int i=2;i<=sum;i++){
inv[i]=(p-p/i)*inv[p%i]%p;
cout<<i<<" de inv shi "<<inv[i]<<endl;
}
}
//上式可用于阶乘求逆
// ine[i]=(mod-(mod/i)*ine[mod%i])%mod; i的逆
// jcc[i]=jcc[i-1]*ine[i]%mod; 阶乘的逆
//即ab的逆=a的逆*b的逆,因为模运算规律,乘法可加mod,而且逆也是一个数。
int main()
{
cout<<ni1(2,5)<<endl;
ni2(5);
return 0;
}