1 题意
给出三个多项式f、g、h,求(f*g)mod(h),(最后一步mod,得到多项式除多项式的余数)。
题目不是对多项式单纯地乘和取余的计算,而是进行了极大地简化,将多项式加法定义为,对应项的系数只有0和1,相加的项的系数是两者异或之和。
2 分析。
尽管不是单纯的多项式乘以多项式、多项式除以多项式,但过程与其类似,要理解多项式乘以多项式、多项式除以多项式的过程如何实现,附百度百科多项式除法(看看图解即可)。
3
#include <iostream>
#include <stdio.h>
#include <string.h>
#include <math.h>
#include <algorithm>
using namespace std;
const int maxn=1010;
int compare(int sum[],int ls,int h[],int lh){
if(ls>lh) return 1;
else if(ls<lh) return 0;
else{
for(int i=ls;i>=0;i--){
if(sum[i]==h[i]) continue;
else return sum[i]-h[i];
}
return 1;
}
}
int main()
{
int kase;
int f[maxn],g[maxn],sum[maxn*2],h[maxn];
scanf("%d",&kase);
while(kase--){
///ini
int lf,lg,lh,ls;
scanf("%d",&lf);
for(int i=lf-1;i>=0;i--) scanf("%d",&f[i]);
scanf("%d",&lg);
for(int i=lg-1;i>=0;i--) scanf("%d",&g[i]);
scanf("%d",&lh);
for(int i=lh-1;i>=0;i--) scanf("%d",&h[i]);
for(int i=lf+lg;i>=0;i--) sum[i]=0;
///multiy
for(int i=0;i<lf;i++){
for(int j=0;j<lg;j++){
sum[i+j]^=(f[i]&g[j]);
}
}
ls=lf+lg-1;
///mod
while(ls&&compare(sum,ls,h,lh)==1){//if sum==h,return 1
int d=ls-lh;
for(int i=0;i<lh;i++){
sum[i+d]^=(h[i]);//对应位开始异或即可
}
while(ls&&sum[ls-1]==0){
ls--;
}
}
///print
cout<<ls;
if(ls==0) cout<<" 0";
else{
for(int i=ls-1;i>=0;i--)
cout<<" "<<sum[i];
}
cout<<endl;
}
}