poj1060

来源:互联网 发布:外贸email软件 编辑:程序博客网 时间:2024/06/05 07:16

主要问题是一开始不理解多项式的除法该怎么做,看了discuss里一个人的提示才明白


http://poj.org/showmessage?message_id=145610

比如(x^6 + x^4 + x^2 + x + 1) (x^7 + x + 1)=x^13 + x^11 + x^9 + x^8 + x^6 + x^5 + x^4 + x^3 + 1 ,
再取x^8 + x^4 + x^3 + x + 1的模,把除式看做b,被除式看做a,则a/b可以这么算:

b*x^5,然后加到a中(因为是取2模,加就可以了也节省时间),得到x^11+x^4+x^3+1,再加上b*x^3,就得到了x^7+x^6+1。
一旦得到的式子次数小于除式b的次数就可以输出了。这里7<8,所以结果就出来了。

开始的时候,测试数据是过了,但提交时WA。。。
以为是余数为0的情况没有考虑,这种情况下应该输出0 0。。。
改了之后还是不对。。。
最后才发现dm应该为df+dg-1,而不是df+dg。。。



//Memory: 244KTime: 32MS//Language: C++Result: Accepted    Source Code    #include<iostream>    #include<vector>    using namespace std;    int main()    {    unsigned caseNum,df,dg,dh;    int i,j;        cin>>caseNum;    while(caseNum--)    {    cin>>df;    vector<unsigned> fx(df,0);    for(i=df-1; i>=0; --i)    cin>>fx[i];    cin>>dg;    vector<unsigned> gx(dg,0);    for(i=dg-1; i>=0; --i)    cin>>gx[i];    cin>>dh;    vector<unsigned> hx(dh,0);    for(i=dh-1; i>=0; --i)    cin>>hx[i];    unsigned dm = df+dg-1;    vector<unsigned> multi(dm,0);    for(i=df-1; i>=0; --i)//乘法fx*gx    {    if(fx[i])    {    for(j=dg-1; j>=0; --j)    {    multi[i+j] ^= (fx[i]*gx[j]);    }    }    }    while(dm>=dh)    {    vector<unsigned> temp(dm,0);    for(i=dh-1; i>=0; --i)//hx乘以x的(dm-dh)次方    {    temp[dm-dh+i] ^= hx[i];    }    for(i=dm-1; i>=0; --i)    {    multi[i] ^= temp[i];    }    for(i=dm-1; i>=0; --i)    {    if(multi[i])    break;    }    dm = i+1;    temp.clear();    }    cout<<dm<<" ";    if(dm==0)    cout<<0<<endl;    else    {    for(i=dm-1; i>=0; --i)    cout<<multi[i]<<" ";    cout<<endl;    }    fx.clear();    gx.clear();    hx.clear();    multi.clear();    }    return 0;    }


原创粉丝点击