http://poj.org/problem?id=1060
题意:多项式的运算的题目,不过这个运算有个特点,就是只要是同项的多项式,无论相加还是相减,都为0,给你三个多项式,分别为a,b,c。
要你求(a*b)%c。
思路:首先吧a*b算出来,然后,求某个项数乘以c会等于a*b的,然后把a*b的最大的幂降到c以下,求出来的就是答案。
#include <stdio.h>
#include <iostream>
#include <string.h> #define me(x) memset(x,0,sizeof(x)) int a[],b[],c[],d[]; int main()
{
int n,ade,bde,cde,dde;
scanf("%d",&n);
while(n--)
{
me(a),me(b),me(c),me(d);
scanf("%d",&ade);
for(int j=--ade;j>=;j--) //这里是为了把幂和其位置相等,便于乘法计算。
scanf("%d",&a[j]);
scanf("%d",&bde);
for(int j=--bde;j>=;j--)
scanf("%d",&b[j]);
scanf("%d",&cde);
for(int j=--cde;j>=;j--)
scanf("%d",&c[j]);
for(int i=ade;i>=;i--)
for(int j=bde;j>=;j--)
{
if(a[i]&&b[j]){ //多项式的乘法,这里还要用上那个他给定你的多项式运算的规则。
if(d[i+j]) d[i+j]=;
else d[i+j]=;
}
}
dde=ade+bde; //d是a*b的答案。dde也就是说这个答案的最高次幂是多少。
while(dde>=cde) //把d的最高次幂比c小。
{
int tmp;
for(int i=cde;i>=;i--)
if(c[i]){
if(d[dde+i-cde]) d[dde+i-cde]=;
else d[dde+i-cde]=;
}
for(int i=dde;i>=;i--) //找d的最高次幂。
if(d[i]) {
dde=i;
break;
}
}
printf("%d",dde+);
for(int i=dde;i>=;i--)
printf(" %d",d[i]);
printf("\n");
}
return ;
}