zoukankan      html  css  js  c++  java
  • 4.3.2 C

    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 

    整体思路:这道题其实没怎么看懂就是简单的从网上找了一下,才知道具体是什么意思,按照意思搬了一下砖

    乘法的话就是和一般的一样,不过因为系数是确定的,因此在做的时候可以通过与运算来实现比较快,加法的话不能忘了对2取余。除法的话麻烦,需要用被除数的最高次幂减掉除数的最高次幂,然后再相加,(在此时一定注意,要将修改的除数放在另一个数组中,因为在下一次运算时还要用到这个数组)知道除数的位数大于被除数的位数。

    代码:

    #include<iostream>
    #include<algorithm>
    using namespace std;
    int main(void)
    {
     int m,n,o,j,x,nn,ii;
     cin>>nn;
     for(ii=0;ii<nn;ii++)
     {
      int c[2000]={0},i,d[2000]={0},e[2000]={0};
      cin>>m;         // 第一组个数
      int a[2000],b[2000];
      for(i=0;i<m;i++)
       cin>>a[m-1-i];
      cin>>n;               //第二组个数
      for(i=0;i<n;i++)
       cin>>b[n-i-1];
      for(i=0;i<m;i++)
       for(j=0;j<n;j++)
        c[i+j]=((a[i]&&b[j])+c[i+j])%2;                   ///////////////注意运算的先后顺序,如果不加上()的话就会出错,因为算数运算比关系运算的级别高
       x=m+n-1;                          //前两个相乘后的位数
        // for(j=0;j<x;j++)
         // cout<<j<<' '<<c[j]<<endl;
       cin>>o;                       //第三组个数
       for(i=0;i<o;i++)
        cin>>d[o-1-i];
       int distance=x-o;               //两个相差的级数
       while(o<=x)//当除数的位数比被除数的位数高的时候,继续进行,知道除数的位数比被除数高为止
       {
        memset(e,0,sizeof(int)*1000);
        for(i=o-1;i>=0;i--)                //     (1)
         e[i+distance]=d[i];          //           (2)
        for(i=0;i<x;i++)
         c[i]=(c[i]+e[i])%2;
        for(i=x-1;i>=0;i--)
         if(c[i]==1)
         {
          x=i+1;
          break;
         }
         distance=x-o;                    //(3)
       }
       
       for(i=o-1;i>=0;i--)//输出时控制位数
        if(c[i]!=0)
        {
         x=i+1;
         break;
        }
        cout<<x<<' ';
        for(i=x-1;i>=0;i--)
         cout<<c[i]<<' ';
        cout<<endl;
        
     }
     return 0;
    }

    本题还有个稍微简单的方法就是将被除数和除数都高位对齐存储这样的话就可以直接加减了,简化了上述代码中的(1)(2)(3)这几步了思路也比较简单了,但是弊端是不能再记录商了,这个算法中不能再得到商值了。。。

  • 相关阅读:
    POJ 1026 Cipher(置换群)
    POJ 1691 Painting A Board(DFS)
    URAL 1073 Square Country(DP)
    Spring Boot系列教程三:使用devtools实现热部署
    Spring Boot系列教程二:创建第一个web工程 hello world
    Spring Boot系列教程一:Eclipse安装spring-tool-suite插件
    java实现二叉树的构建以及3种遍历方法
    二叉树的java实现
    各种数据库的分页查询语句
    sql语句查询各门课程平均分的最大值
  • 原文地址:https://www.cnblogs.com/zswbky/p/5432135.html
Copyright © 2011-2022 走看看