这道题很怪的,你会发现如果老老实实按手动的方法进行多项式除法,时间肯定超,而且题目中有点诱引你建立加法,乘法,取模的函数,但其实加法的函数是不必要的,因为如果在取模中按部就班调用加法,会超时。
解决办法就是利用模2的特性,直接用除的多项式系数对齐被除系数的最高部分,加上,然后再移到加后的被除系数最高部分,再加,直到最高的degree小于除式的degree
这一题开始,采用了单进单出的输入输出方式,借鉴了网上看到的其他人的程序,注意主函数中两行注释的语句,如果打开它们的话,可以把标准输入流改成从文件输入,这样以来你只需要把测试输入存在文件中就可以了。呵呵,小技巧,而且这个主函数的模式也可以直接在其他要求类似的程序中复用,看来多读别人的程序也是很有好处的哦。。。
#include
<
iostream
>
using
namespace
std;
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
#define
MAX 1001
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
class
Poly
![](https://i-blog.csdnimg.cn/blog_migrate/a41954a27d6ad96fa2c2cf816e677448.gif)
...
{
public:
int de;//degree
bool mem[MAX<<1];//member
}
;
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
void
multpoly(Poly a, Poly b, Poly
&
res)
![](https://i-blog.csdnimg.cn/blog_migrate/a41954a27d6ad96fa2c2cf816e677448.gif)
...
{
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;
}
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
void
modpoly(Poly
&
a, Poly h)
![](https://i-blog.csdnimg.cn/blog_migrate/a41954a27d6ad96fa2c2cf816e677448.gif)
...
{
int i,flag=1;
while (flag)
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
...{
for (i=a.de;i>=0&&(!a.mem[i]);i--);
if (i<h.de)
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
...{
a.de = i;
flag = 0;
}
else
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
...{
for (int j=h.de; j>=0; i--,j--)
a.mem[i] = (a.mem[i]+h.mem[j])%2;
}
}
}
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
void
readpoly(Poly
&
a)
![](https://i-blog.csdnimg.cn/blog_migrate/a41954a27d6ad96fa2c2cf816e677448.gif)
...
{
int i,mid;
cin >> mid;
a.de = mid - 1;
for(i=a.de;i>=0;i--)
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
...{
cin >> a.mem[i];
}
}
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
void
solve()
![](https://i-blog.csdnimg.cn/blog_migrate/a41954a27d6ad96fa2c2cf816e677448.gif)
...
{
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--)
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
...{
cout << ' ' << temp.mem[j];
}
cout << endl;
}
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
int
main()
![](https://i-blog.csdnimg.cn/blog_migrate/a41954a27d6ad96fa2c2cf816e677448.gif)
...
{
int t;
// freopen("1026.txt","r",stdin);
cin >> t;
while(t--)
solve();
// fclose(stdin);
return 0;
}