这道题很怪的,你会发现如果老老实实按手动的方法进行多项式除法,时间肯定超,而且题目中有点诱引你建立加法,乘法,取模的函数,但其实加法的函数是不必要的,因为如果在取模中按部就班调用加法,会超时。
解决办法就是利用模2的特性,直接用除的多项式系数对齐被除系数的最高部分,加上,然后再移到加后的被除系数最高部分,再加,直到最高的degree小于除式的degree
这一题开始,采用了单进单出的输入输出方式,借鉴了网上看到的其他人的程序,注意主函数中两行注释的语句,如果打开它们的话,可以把标准输入流改成从文件输入,这样以来你只需要把测试输入存在文件中就可以了。呵呵,小技巧,而且这个主函数的模式也可以直接在其他要求类似的程序中复用,看来多读别人的程序也是很有好处的哦。。。
#include <iostream>
using namespace std;

#define MAX 1001

class Poly

...{
public:
int de;//degree
bool mem[MAX<<1];//member
};

void multpoly(Poly a, Poly b, Poly &res)

...{
int i,j;
res.de = a.de + b.de;
for(i=0;i<=res.de;i++)
res.mem[i] = 0;
for(i=a.de;i>=0;i--)
for(j=b.de;j>=0;j--)
res.mem[i+j] = (res.mem[i+j] + a.mem[i]*b.mem[j]) % 2;
}

void modpoly(Poly &a, Poly h)

...{
int i,flag=1;
while (flag)

...{
for (i=a.de;i>=0&&(!a.mem[i]);i--);
if (i<h.de)

...{
a.de = i;
flag = 0;
}
else

...{
for (int j=h.de; j>=0; i--,j--)
a.mem[i] = (a.mem[i]+h.mem[j])%2;
}
}
}

void readpoly(Poly &a)

...{
int i,mid;
cin >> mid;
a.de = mid - 1;
for(i=a.de;i>=0;i--)

...{
cin >> a.mem[i];
}
}

void solve()

...{
Poly f,g,h,temp;
readpoly(f);
readpoly(g);
readpoly(h);
multpoly(f, g,temp);
modpoly(temp, h);
cout << temp.de+1;
for(int j=temp.de;j>=0;j--)

...{
cout << ' ' << temp.mem[j];
}
cout << endl;
}

int main()

...{
int t;
// freopen("1026.txt","r",stdin);
cin >> t;
while(t--)
solve();
// fclose(stdin);
return 0;
}