Problem : Modular multiplication of polynomials
Description:定义两个多项式的加法和减法为当同幂级的项出现两次或不出现时,该幂级前边的系数为0,否则为1;两个多项式的乘法和普通的多项式乘法一样展开,然后按照加法或减法规则合并;两个多项式的除法为对这两个多项式相除取余。
Solution:多项式的乘法的话按照我们平常做的那样展开,然后模2决定其前边的系数,多项式的除法的话,类似我们平常的除法运算,如果不懂的话可以自行百度多项式取模运算。
Code(C++):
#include <iostream>
#include <cstring>
using namespace std;
int a[3050];
int b[3050];
int c[3050];
int ans[3050];
int p[3050];
void mul(int a[],int b[],int lena,int lenb,int ans[])
{
for(int i=lena; i>=0; i--)
{
if(a[i]==0)
continue;
for(int j=lenb; j>=0; j--)
{
if(b[j]==0)
continue;
ans[i+j]+=1;
ans[i+j]%=2;
}
}
return ;
}
int length(int k)
{
int temp;
for(int i=k; i>=0; i--)
{
if(ans[i]!=0)
{
temp=i;
break;
}
}
return temp;
}
int main()
{
int N,i,k;
int m,n,t,dex;
cin>>N;
while(N--)
{
memset(ans,0,sizeof(ans));
cin>>m;
for(i=m-1; i>=0; i--)
cin>>a[i];
cin>>n;
for(i=n-1; i>=0; i--)
cin>>b[i];
cin>>t;
for(i=t-1; i>=0; i--)
cin>>c[i];
//前两个数组相乘
mul(a,b,m-1,n-1,ans);
k=length(m+n-2);
dex=k-t+1;
while(k>=t-1)
{
memset(a,0,sizeof(a));
dex=k-t+1;
a[dex]=1;
memset(p,0,sizeof(p));
mul(a,c,dex,t-1,p);
for(i=k; i>=0; i--)
{
ans[i]=ans[i]+p[i];
ans[i]=ans[i]%2;
}
k=length(k);
}
cout<<k+1<<" ";
for(i=k; i>=0; i--)
cout<<ans[i]<<" ";
cout<<endl;
}
return 0;
}