//题目连接:http://acm.csu.edu.cn/OnlineJudge/problem.php?id=1163
//题目大意.求每个b[i]=(a[0]*a[1]*..*a[i]*.*a[N-1]/a[i])%m
//解题思路:这是一个求解乘法逆元的题目..在EXGCD(a,b,&x,&y)里面.x是a对模b的乘法逆元
//y是b对a的乘法逆元.return的是GCD(a,b).只有当return是1的时候.才存在乘法逆元..
#include<stdio.h>
#include<stdlib.h>
#include<iostream>
#include<math.h>
#include<vector>
#include<string.h>
#include<algorithm>
using namespace std;
#define LL long long
int ExGcd(int a, int b, int &x, int &y)
{
if(b == 0)
{
x = 1;
y = 0;
return a;
}
int r = ExGcd(b, a % b, x, y);
int t = x;
x = y;
y = t - a / b * y;
return r;
}
int a[111111];
int n,m;
int main()
{
while(scanf("%d%d",&n,&m) != EOF)
{
LL x = 1;
for(int i = 1 ; i <= n ; i++)
{
scanf("%lld",&a[i]);
x = x * a[i] % m;
}
int p , q;
for(int i = 1 ; i <= n ; i++)
{
if(ExGcd(a[i],m,p,q) == 1)
{
while(p < 0) p += m;
if(i != n)
printf("%d ",(p*x)%m);
else printf("%d\n",p*x%m);
}
}
}
}
csu1163扩展欧几里得之乘法逆元
最新推荐文章于 2020-01-13 13:21:04 发布