1.扩展欧几里得
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
void exgcd(ll a,ll b,ll &x,ll &y)
{
if(b==0)
{
x=1;
y=0;
return ;
}
exgcd(b,a%b,x,y);
ll t=x;
x=y;
y=t-a/b*y;
}
int main()
{
ll n,p,x,y;
scanf("%lld%lld",&n,&p);
for(ll i=1;i<=n;i++)
{
exgcd(i,p,x,y);
printf("%lld\n",(x%p+p)%p);
}
return 0;
}
2.快速幂
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll mod;
ll fpm(ll a,ll b)
{
ll ans=1;
while(b)
{
if(b&1)ans=ans*a%mod;
a=a*a%mod;
b>>=1;
}
return ans;
}
int main()
{
ll n;
scanf("%lld%lld",&n,&mod);
for(ll i=1;i<=n;i++)
printf("%lld\n",fpm(i%mod,mod-2));
return 0;
}
3.线性算法
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll mod;
ll a[3000005];
int main()
{
ll n;
a[1]=1;
scanf("%lld%lld",&n,&mod);
printf("%lld\n",a[1]);
for(ll i=2;i<=n;i++)
{
a[i]=-(mod/i)*a[mod%i];
a[i]=(a[i]%mod+mod)%mod;
printf("%lld\n",a[i]);
}
return 0;
}
4.阶乘逆元
inv[i+1]=1/(i+1)!
inv[i+1]*(i+1)=1/i!=inv[i]