sgu 140 分类: sgu 2015-03-15 16:22 35人阅读 评论(0) 收藏
解模意义下的方程
可以视为解不定方程
用欧几里得扩展算法
二元情形:
设
1,显然当
2,
设
根据朴素的欧几里德原理有
则:
即:
也就是
根据恒等定理得:
这样我们就得到了求解
多元情形:
可以用二元方法解出
原方程中
最后要注意把
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<ctime>
#include<iostream>
#include<algorithm>
const int MAXN = 105;
int ax[MAXN] = {0};
int A[MAXN] = {0};
int N,P,B;
int super_gcd(int a,int b,int &x,int &y)
{
if(!b)
{
x = 1;
y = 0;
return a;
}
else
{
int ret = super_gcd(b,a%b,x,y);
int tmp = x;
x = y;
y = tmp - a/b*y;
return ret;
}
}
int main()
{
int gcd;
#ifndef ONLINE_JUDGE
freopen("sgu140.in","r",stdin);
freopen("sgu140.out","w",stdout);
#endif
scanf("%d%d%d",&N,&P,&B);
for(int i = 1; i <= N; i++)
{scanf("%d",&A[i]);A[i] %= P;}
ax[1] = 1 , gcd = A[1]; A[N+1] = P;
for(int i = 2; i <= N+1; i++)
{
int x , y;
gcd = super_gcd(gcd , A[i] , x , y);
ax[i] = y;
for(int j = 1 ; j < i; j++)
ax[j] *= x,ax[j] %= P;
}
if(B%gcd)
puts("NO");
else
{
int tmp = B/gcd;
for(int i = 1; i <= N; i++)
{ax[i] *= tmp; ax[i] = (ax[i]%P + P)%P;}
puts("YES");
for(int i = 1; i <= N; i++)
printf("%d ",ax[i]);
}
#ifndef ONLINE_JUDGE
fclose(stdin);
fclose(stdout);
#endif
}
版权声明:本文为博主原创文章,未经博主允许不得转载。