代码来源:DeathYmz
AC的C++语言程序如下:
#include<cstdio>
#include<iostream>
#include<cstring>
using namespace std;
const int maxn=1100;
int f[maxn],g[maxn],h[maxn];
int e[2*maxn];
int s[2*maxn];
int a,b,c;
//读懂题意
int main()
{
int n;
scanf("%d",&n);
while(n--)
{
memset(f,0,sizeof(f));
memset(g,0,sizeof(g));
memset(h,0,sizeof(h));
memset(s,0,sizeof(s));
scanf("%d",&a);
for(int i=a-1;i>=0;--i)scanf("%d",&f[i]);
scanf("%d",&b);
for(int i=b-1;i>=0;--i)scanf("%d",&g[i]);
scanf("%d",&c);
for(int i=c-1;i>=0;--i)scanf("%d",&h[i]);
//多项式相乘位数
int d=a+b-1;
for(int i=0;i<d;i++) s[i]=0;
for(int i=0;i<a;i++)
for(int j=0;j<b;j++)
s[i+j]=((f[i]&&g[j])+s[i+j])%2;//f(x)*g(x) 位数mod2
int dis=d-c;
while(d>=c)
{
memset(e,0,sizeof(e));
for(int i=c-1;i>=0;i--)
e[i+dis]=h[i];
for(int i=0;i<d;i++)
s[i]=(s[i]+e[i])%2;
for(int i=d-1;i>=0;i--)
if(s[i]==1)
{d=i+1;break;}
dis=d-c;
}
for(int i=c-1;i>=0;i--)
if(s[i]!=0)
{d=i+1;break;}//输出预处理前面多余零
printf("%d",d);
for(int i=d-1;i>=0;i--)
printf(" %d",s[i]);
printf("\n");
}
return 0;
}