扩展欧几里得标准模板
求得x为最终解
exgcd应用******
exgcd 求得是 中x的一个可行解
注明:这个&x,&y可以观察到是在互换的(公式推出来的),y和x换地址上的数就可以
#include<iostream>
#include<cstdio>
using namespace std;
int ans;
int n,p,x,y,d;
inline void exgcd(int a,int b,int &x,int &y)
{
if(b==0)
{
x=1;y=0;
return;
}
exgcd(b,a%b,x,y);
int tmp=x;
x=y;
y=tmp-a/b*x;
}
inline int get_exgcd(int a,int mod)
{
exgcd(a,mod,x,y);
return (x%mod+mod)%mod;
}
int main()
{
scanf("%d%d",&n,&p);
for(int i=1;i<=n;i++)
{
ans=get_exgcd(i,p);
printf("%d\n",ans);
}
return 0;
}
总结:
就是一个递归的过程,每次的x,y会交换位置,最终可以化简到只剩一个x,x即为i对mod的乘法逆元。逆元可以在a/b时转化为a*b',进而实现每次的取模,可以不超数据范围,也可以加速程序