链接
https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=1892
题解
代码
//多项式最大公约数
#include <bits/stdc++.h>
#define maxn 110
#define cl(x) memset(x,0,sizeof(x))
using namespace std;
struct Polynomial
{
int a[maxn], D;
Polynomial(){cl(a);D=0;}
int& operator[](int index){return a[index];}
}A, B, ans;
int N;
int fastpow(int a, int b, int mod)
{
int t=a, ans=1;
for(;b;t=t*t%mod,b>>=1)if(b&1)ans=ans*t%mod;
return ans;
}
Polynomial operator%(Polynomial a, Polynomial b)
{
int i, j, k, D;
D=a.D-b.D;
for(i=0;i<=D;i++)
{
k=a[i]*fastpow(b[0],N-2,N)%N;
for(j=0;j<=b.D;j++)a[i+j]=((a[i+j]-k*b[j])%N+N)%N;
}
for(i=0;i<=a.D and a[i]==0;i++);
for(j=i;j<=a.D;j++)a[j-i]=a[j];
a.D-=i;
return a;
}
Polynomial gcd(Polynomial a, Polynomial b){return b.D==-1?a:gcd(b,a%b);}
int read(int x=0)
{
int c, f=1;
for(c=getchar();!isdigit(c) and c!=-1;c=getchar())if(c=='-')f=-1;
for(;isdigit(c);c=getchar())x=(x<<1)+(x<<3)+c-48;
return f*x;
}
int main()
{
int i, t, kase=0;
while(N=read())
{
printf("Case %d: ",++kase);
A.D=read();
for(i=0;i<=A.D;i++)A[i]=read();
B.D=read();
for(i=0;i<=B.D;i++)B[i]=read();
ans=gcd(A,B);
t=fastpow(ans[0],N-2,N);
for(i=0;i<=ans.D;i++)ans[i]=ans[i]*t%N;
printf("%d",ans.D);
for(i=0;i<=ans.D;i++)printf(" %d",ans[i]);
putchar(10);
}
return 0;
}