poj1060

来源:互联网 发布:宁波楼盘成交数据 编辑:程序博客网 时间:2024/06/06 17:10

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;}
0 0
原创粉丝点击