poj 1060 Modular multiplication of polynomials 二进制多项式取余式运算。

题目:来源于http://poj.org/problem?id=1060

描述:

              定义二进制多项式加法和减法 :  

                          (x^6 + x^4 + x^2 + x + 1) + (x^7 + x + 1) = x^7 + x^6 + x^4 + x^2

                          (x^6 + x^4 + x^2 + x + 1) - (x^7 + x + 1) = x^7 + x^6 + x^4 + x^2

             定义二进制多项式乘法:

                          (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^6 + x^4 + x^2 + x + 1) (x^7 + x + 1) modulo (x^8 + x^4 + x^3 + x + 1) = x^7 + x^6 + 1

要求:输入g(x)、f(x)和h(x) 求出(g(x)*f(x))mod h(x)

具体输入要求如下:

2    (2个测试样例)
7 1 0 1 0 1 1 1   (g(x)     7表示多项式最大为x^6依次往下推)
8 1 0 0 0 0 0 1 1 (f(x) 8表示多项式最大为x^7依次往下推)
9 1 0 0 0 1 1 0 1 1 (h(x) 9表示多项式最大为x^8依次往下推)  这是第一测试样例,即每个测试样例占三行
10 1 1 0 1 0 0 1 0 0 1 
12 1 1 0 1 0 0 1 1 0 0 1 0 
15 1 0 1 0 1 1 0 1 1 1 1 1 0 0 1
 
输出结果:
 
8 1 1 0 0 0 0 0 1 
14 1 1 0 1 1 0 0 1 1 1 0 1 0 0 

 

 

思路:

        (1)  乘法:定义一个bitwap,做乘法的时候,先输入g(x),然后输入f(x)。每当f(x)第n位不等于0,就将g(x)移动n位即在bitmap上从n位开始,将g(x)加到bitmap上。

           (2) 除法:每次都让h(x)与bitmap上的最高位len到len-len(h)+1与,相当于乘了x^n,将h(x)的最高位系数乘到乘积的最高位,然后求出余数比较余数的最高位与h(x)的最高位谁大,如果余数的最高位小于h(x)的最高位,则结束。

 

代码:

#include <iostream>
#include<cstdlib>

using namespace std;

#define  bitmapLen 2000
bool bitmap[bitmapLen];
bool Fx[1000];
bool Hx[1000];

class Modular{
public:
	Modular(int n){
		this->n = n;
	}
	void solution()
	{
		int i,j,k;
		for(i=0;i<n;i++){
			for(j=0;j<bitmapLen;j++){
				bitmap[j] = false;
			}

			int len1;
			cin>>len1;
			for(j=0;j<len1;j++){//输入g(x)
				int bit1;cin>>bit1;
				Fx[len1 - j-1] = (bool)bit1;
			}
            
			int len2;
			cin>>len2;
			int count = len2-1;
			for(j=0;j<len2;j++){//求乘积
				int bit2;cin>>bit2;//输入h(x),同时求乘积
				if(bit2){
					for(k=0;k<len1;k++)
						bitmap[k+count] ^= Fx[k]; 
				}
                count--;
			}

			int len = len1+len2-2;

            int len3;cin>>len3;
			for(j=0;j<len3;j++){//输入h(x)
				int bit3;cin>>bit3;
                Hx[len3 - j-1] = (bool)bit3;
			}
            len3--;
			while(len3<=len){
				j = len3;
				for(k=len;k>=len-len3;k--){//取商求余
					bitmap[k] ^= Hx[j--];
				}
      
				while(bitmap[len]==0)len--;//得到余数的最高位
			}
			cout<<len+1<<" ";
			for(k = len;k>=0;k--)cout<<bitmap[k]<<" ";
			cout<<endl;
 
		}
	}
protected:
    
private:
    int n;
};


int main()
{
	int n;
	cin>>n;
	Modular poj1060(n);
	poj1060.solution();
	system("pause");
	return 0;
}

 

后记:困,饿

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值