1256 乘法逆元
基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础题 收藏 关注
给出2个数M和N(M < N),且M与N互质,找出一个数K满足0 < K < N且K * M % N = 1,如果有多个满足条件的,输出最小的。
Input
输入2个数M, N中间用空格分隔(1 <= M < N <= 10^9)
Output
输出一个数K,满足0 < K < N且K * M % N = 1,如果有多个满足条件的,输出最小的。
Input示例
2 3
Output示例
2
#include <iostream>
#include <iomanip>
using namespace std;
int d[1000][10];
int x[1000],y[1000];
int main()
{
int a,b;
while(cin>>a>>b)
{
int i;
d[0][0]=a;
d[0][1]=b;
for(i=1;;i++)
{
d[i][0]=d[i-1][1];
d[i][1]=d[i-1][0]%d[i-1][1];
//cout<<d[i][0]<<' '<<d[i][1]<<endl;
if(d[i][1]==0) break;
}
int t=i;
x[t]=1;
y[t]=0;
for(i=t-1;i>=0;i--)
{
x[i]=y[i+1];
y[i]=x[i+1]-(d[i][0]/d[i][1]*y[i+1]);
//cout<<x[i]<<' '<<y[i]<<endl;
}
cout<<"此项为扩展欧几里得的递归变化"<<endl;
cout<<setw(3)<<"a"<<setw(3)<<"b"<<setw(3)<<"x"<<setw(3)<<"y"<<endl;
for(i=0;i<=t;i++)
{
cout<<setw(3)<<d[i][0]<<setw(3)<<d[i][1]<<setw(3)<<x[i]<<setw(3)<<y[i]<<endl;
}
*/
while(x[0]<0) x[0]+=b;
cout<<x[0]<<endl;
}
}