zoukankan      html  css  js  c++  java
  • POJ 1060:Modular multiplication of polynomials

    Modular multiplication of polynomials
    Time Limit: 1000MS   Memory Limit: 10000K
    Total Submissions: 4377   Accepted: 1980

    Description

    Consider polynomials whose coefficients are 0 and 1. Addition of two polynomials is achieved by 'adding' the coefficients for the corresponding powers in the polynomials. The addition of coefficients is performed by addition modulo 2, i.e., (0 + 0) mod 2 = 0, (0 + 1) mod 2 = 1, (1 + 0) mod 2 = 1, and (1 + 1) mod 2 = 0. Hence, it is the same as the exclusive-or operation. 

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

    Subtraction of two polynomials is done similarly. Since subtraction of coefficients is performed by subtraction modulo 2 which is also the exclusive-or operation, subtraction of polynomials is identical to addition of polynomials. 

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

    Multiplication of two polynomials is done in the usual way (of course, addition of coefficients is performed by addition modulo 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 

    Multiplication of two polynomials f(x) and g(x) modulo a polynomial h(x) is the remainder of f(x)g(x) divided by h(x). 

    (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 
    The largest exponent of a polynomial is called its degree. For example, the degree of x^7 + x^6 + 1 is 7. 

    Given three polynomials f(x), g(x), and h(x), you are to write a program that computes f(x)g(x) modulo h(x). 
    We assume that the degrees of both f(x) and g(x) are less than the degree of h(x). The degree of a polynomial is less than 1000. 

    Since coefficients of a polynomial are 0 or 1, a polynomial can be represented by d+1 and a bit string of length d+1, where d is the degree of the polynomial and the bit string represents the coefficients of the polynomial. For example, x^7 + x^6 + 1 can be represented by 8 1 1 0 0 0 0 0 1.

    Input

    The input consists of T test cases. The number of test cases (T) is given in the first line of the input file. Each test case consists of three lines that contain three polynomials f(x), g(x), and h(x), one per line. Each polynomial is represented as described above.

    Output

    The output should contain the polynomial f(x)g(x) modulo h(x), one per line.

    Sample Input

    2 
    7 1 0 1 0 1 1 1 
    8 1 0 0 0 0 0 1 1 
    9 1 0 0 0 1 1 0 1 1 
    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

    Sample Output

    8 1 1 0 0 0 0 0 1 
    14 1 1 0 1 1 0 0 1 1 1 0 1 0 0 

    Source

    Taejon 2001

    你  离  开  了  ,  我  的  世  界  里  只  剩  下  雨  。  。  。

    #include <iostream>
    #include<string.h>
    using namespace std;
    int pd(int sum[],int ls,int h[],int lh)
    {
        if(ls>lh)return 1;
        if(ls<lh)return -1;
        if(ls==lh)
        {
            int i;
            for(i=ls-1; i>=0; i--)
            {
                if(sum[i]&&!h[i])return 1;
                if(!sum[i]&&h[i])return -1;
            }
        }
        return 0;
    }
    int main()
    {
        int n;
        cin>>n;
        int c;
        for(c=1; c<=n; c++)
        {
            int lf,lg,lh;
            int f[1001],g[1001],h[1001];
            int i;
            cin>>lf;
            for(i=lf-1; i>=0; i--)
                cin>>f[i];
            cin>>lg;
            for(i=lg-1; i>=0; i--)
                cin>>g[i];
            cin>>lh;
            for(i=lh-1; i>=0; i--)
                cin>>h[i];
            int sum[2001];
            memset(sum,0,sizeof(sum));
            int j;
            for(i=0; i<lf; i++)
                for(j=0; j<lg; j++)
                    sum[i+j]=sum[i+j]^(f[i]&g[j]);
            int ls;
            ls=lf+lg-1;
            while(pd(sum,ls,h,lh)>=0)
            {
                int d=ls-lh;
                for(i=0; i<lh; i++)
                    sum[i+d]=sum[i+d]^h[i];
                while(ls&&!sum[ls-1])
                    --ls;
            }
            if(ls==0)ls=1;
            cout<<ls<<" ";
            for(i=ls-1; i>0; i--)
                cout<<sum[i]<<" ";
            cout<<sum[0]<<endl;
        }
        return 0;
    }


  • 相关阅读:
    睡前一分钟打造完美下半身 健康程序员,至尚生活!
    几种不伤身体的速效减肥秘方 健康程序员,至尚生活!
    头发一周洗几次才适宜? 健康程序员,至尚生活!
    夏日驱蚊虫蟑螂的最好办法! 健康程序员,至尚生活!
    WPF控件和布局
    《深入浅出WPF》笔记——绑定篇(二)
    WPF中的DataTemplate绑定使用的场合
    WPF第一个程序和XAML初探
    实习总结之jquery实例
    下一步要实战的东西
  • 原文地址:https://www.cnblogs.com/im0qianqian/p/5989590.html
Copyright © 2011-2022 走看看