poj 1060 Modular multiplication of polynomialsバイナリ多項式取余式演算。

3081 ワード

テーマ:由来は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)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;
}
 
: い、お が きます