ZOJ-1026-Modular multiplication of polynomials

这道题很怪的,你会发现如果老老实实按手动的方法进行多项式除法,时间肯定超,而且题目中有点诱引你建立加法,乘法,取模的函数,但其实加法的函数是不必要的,因为如果在取模中按部就班调用加法,会超时。

解决办法就是利用模2的特性,直接用除的多项式系数对齐被除系数的最高部分,加上,然后再移到加后的被除系数最高部分,再加,直到最高的degree小于除式的degree

这一题开始,采用了单进单出的输入输出方式,借鉴了网上看到的其他人的程序,注意主函数中两行注释的语句,如果打开它们的话,可以把标准输入流改成从文件输入,这样以来你只需要把测试输入存在文件中就可以了。呵呵,小技巧,而且这个主函数的模式也可以直接在其他要求类似的程序中复用,看来多读别人的程序也是很有好处的哦。。。

#include  < iostream >
using   namespace  std;

#define  MAX 1001

class  Poly
{
public:
    
int de;//degree
    bool mem[MAX<<1];//member
}
;

void  multpoly(Poly a, Poly b, Poly  & res)
{
    
int i,j;
    res.de 
= a.de + b.de;
    
for(i=0;i<=res.de;i++
        res.mem[i] 
= 0;
    
for(i=a.de;i>=0;i--)        
        
for(j=b.de;j>=0;j--)            
            res.mem[i
+j] = (res.mem[i+j] + a.mem[i]*b.mem[j]) % 2;
}


void  modpoly(Poly  & a, Poly h)
{
    
int i,flag=1;
    
while (flag)
    
{
        
for (i=a.de;i>=0&&(!a.mem[i]);i--);
        
if (i<h.de)
        
{
            a.de 
= i;
            flag 
= 0;
        }

        
else
        
{
            
for (int j=h.de; j>=0; i--,j--)
                a.mem[i] 
= (a.mem[i]+h.mem[j])%2;
        }

    }

}


void  readpoly(Poly  & a)
{
    
int i,mid;
    cin 
>> mid;
    a.de 
= mid - 1;
    
for(i=a.de;i>=0;i--)
    
{
        cin 
>> a.mem[i];
    }

}


void  solve()
{    
    Poly f,g,h,temp;
    readpoly(f);
    readpoly(g);
    readpoly(h);
      multpoly(f, g,temp);
    modpoly(temp, h);
    cout 
<< temp.de+1;    
    
for(int j=temp.de;j>=0;j--)
    
{
        cout 
<< ' ' << temp.mem[j];
    }
    
    cout 
<< endl;    
}


int  main()
{
    
int t;
//    freopen("1026.txt","r",stdin);
    cin >> t;
    
while(t--)
        solve();
//    fclose(stdin);
    return 0;
}

你可能感兴趣的:(ZOJ-1026-Modular multiplication of polynomials)