题目:来源于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;
}
后记:困,饿