poj 1060解题报告

来源:互联网 发布:js杀破狼歌曲下载 编辑:程序博客网 时间:2024/06/03 15:13

题目很长,但是比较好理解。题意就是求(f(x)*g(x))mod h(x)

#include<iostream>
#include<string>
#include<stdio.h>
using namespace std;

int testcase;     //测试用例的个数       
const int maxl = 1005;
int f[maxl];            //存放第一个多项式的系数
int lf;                    //第一个多项式的项数(包括常数项)
int g[maxl];         //存放第二个多项式的系数
int lg;                //第二个多项式的项数
int h[maxl];        //多项式除数的系数
int lh;                 //多项式除数的项数
int sum[maxl + maxl];       //存放两个多项式相乘的结果和最后相除得到的结果
int ls;                                   //在计算过程中,sum数组有效位的长度

void init()                          //初始化各个多项式
{
     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];
       }
       lh--;
}

void dealwith()
{
       int i,j;
        memset(sum,0,sizeof(sum));
       ls = lf + lg - 1;
       for(i = 0;i < lf;i++)
      {
            for(j = 0;j < lg;j++)
           {
                 sum[i+j] = sum[i+j]^(f[i]&g[j]);            //作与或和与运算
           }
      }
       while(ls && !sum[ls])
      {
             ls--;
      }
       while(ls >= lh)
       {
              int d = ls - lh;
              for(i = 0;i <= lh;i++)
             {
                    sum[d+i] = sum[d+i]^h[i];
             }
             while(ls && !sum[ls])
            {
                  ls--;
             }
        }

        cout<<ls+1<<" ";
        for(i = ls ;i > 0;i--)
        cout<<sum[i]<<" ";
        cout<<sum[0]<<endl;
 
}
int main()
{
        cin>>testcase;
        while(testcase--)
        {
             init();
             dealwith();
         }
         return 0;
}

原创粉丝点击