这是一个相对简单的模拟,因为运算规则已经告诉了我们,并且比较简单,不要被吓到……
思路:多项式除以另外一个多项式,如果能除,那么他的最高次一定被降低了,如果最高次不能被降低,那说明已经无法被除,就是题目要求输出的膜了,降低最高次的方法很简单,只要被除式的最高次 >= 除式的最高次,就将除式的最高次升高到与被除式一样高,然后让被除式减去它,直到不满足上述关系为止。
代码如下:
#include<cstdio> #include<algorithm> #include<iostream> #include<cstring> using namespace std; #define maxn 1100 int f[maxn],g[maxn],h[maxn]; int mul[maxn*2],now[maxn*2]; int main() { int t,f1,g1,h1,m1,tmp; scanf("%d",&t); while(t--){ scanf("%d",&f1); for(int i = f1-1;i >= 0;i--) scanf("%d",&f[i]); scanf("%d",&g1); for(int i = g1-1;i >= 0;i--) scanf("%d",&g[i]); scanf("%d",&h1); for(int i = h1-1;i >= 0;i--) scanf("%d",&h[i]); for(int i = 0;i <= f1+g1;i++) mul[i] = 0; for(int i = 0;i < f1;i++){ for(int j = 0;j < g1;j++){ mul[i+j] += f[i]*g[j]; mul[i+j] %= 2; } } h1--; m1 = f1+g1-2; while(h1 <= m1){ tmp = m1 - h1; for(int i = 0;i <= m1;i++) now[i] = 0; for(int i = 0;i <= h1;i++){ now[i+tmp] = h[i]; } for(int i = m1;i >= 0;i--) mul[i] = (mul[i]+now[i])%2; for(int i = m1;i >= 0;i--) { if(mul[i]){ m1 = i; break; } } } printf("%d",m1+1); for(int i = m1;i >= 0;i--){ printf(" %d",mul[i]); } puts(""); } return 0; }