题目来源:http://poj.org/problem?id=1060

题目大意:

  考虑系数为0和1的多项式。两个多项式的加法可以通过把相应次数项的系数相加而实现。但此处我们用模2加法来计算系数之和。一个实例:

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

同样,多项式的减法我们在求系数之差时也用模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

两个多项式f(x)和g(x)模多项式h(x)是求f(x)*g(x)除以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

多项式中最高次数称为degree。给出f(x) g(x)和h(x),写一个程序求出  f(x)*g(x) mod h(x)  的结果。假定f(x)和g(x)的degree都小于h(x),多项式的degree都小于1000。

由于系数都是0或1,假设多项式的degree为d,那么该多项式可以由一个次数指示整数(d + 1)和d+1个二进制位来表示。比如x^7 + x^6 + 1 可表示为: 8 1 1 0 0 0 0 0 1.

输入:由T个测试用例组成,并在输入的第一行给出T的值。每个用例由三行组成,分别为f(x),g(x),h(x)。多项式的表示方法如前所述。

输出:用如前所述的表示方式表达f(x)*g(x)%h(x)的值。每行对应一个输出的多项式。


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

模拟题, 需要注意的两个地方:

1. 虽然题目中涉及的f(x) g(x) h(x)和输出的结果r(x)最高次都不会超过1000, 但中间结果f(x) * g(x)的最高次可能会超过1000,最大到2000.

2. 余数为0情况应输出0 0.

第一次用bitset.

 ////////////////////////////////////////////////////////////////
// POJ1060 Modular multiplication of polynomials
// Memory: 224K Time: 63MS
// Language: C++ Result : Accepted
/////////////////////////////////////////////////////////////// #include <iostream>
#include <bitset> using namespace std; bitset<> fx;
bitset<> gx;
bitset<> hx;
bitset<> rx;
int dfx, dgx, dhx, drx; int main(void) {
int T;
cin >> T;
for (int case_id = ; case_id < T; ++case_id) { fx.reset();
gx.reset();
hx.reset();
rx.reset(); //读取输入
cin >> dfx;
int buf;
for (int d = dfx - ; d >= ; --d) {
cin >> buf;
fx[d] = buf;
}
cin >> dgx;
for (int d = dgx - ; d >= ; --d) {
cin >> buf;
gx[d] = buf;
}
cin >> dhx;
for (int d = dhx - ; d >= ; --d) {
cin >> buf;
hx[d] = buf;
} //乘法计算
for (int d1 = dfx - ; d1 >= ; --d1) {
for (int d2 = dgx - ; d2 >= ; --d2) {
rx[d1 + d2] = fx[d1] & gx[d2] ^ rx[d1 + d2];
}
}
for (drx = ; drx >= ; --drx) {
if (rx[drx] == ) {
++drx;
break;
}
} //除法计算
while (drx >= dhx && drx > ) {
int t = drx - dhx;
for (int d = dhx - ; d >= ; --d) {
rx[d + t] = hx[d] ^ rx[d + t];
}
while (drx >= && rx[drx] == ) {
--drx;
}
++drx;
} //输出
cout << drx;
for (int d = drx - ; d > ; --d) {
cout << " " << rx[d];
}
cout << " " << rx[] << endl;
}
return ;
}

附测试数据:


input


output

POJ1060 Modular multiplication of polynomials的更多相关文章

  1. POJ1060 Modular multiplication of polynomials解题报告 (2011-12-09 20:27:53)

    Modular multiplication of polynomials Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 3 ...

  2. POJ 1060:Modular multiplication of polynomials

    Modular multiplication of polynomials Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 4 ...

  3. POJ 1060 Modular multiplication of polynomials(多项式的加减乘除,除法转化成减法来求)

    题意:给出f(x),g(x),h(x)的 (最高次幂+1)的值,以及它们的各项系数,求f(x)*g(x)/h(x)的余数. 这里多项式的系数只有1或0,因为题目要求:这里多项式的加减法是将系数相加/减 ...

  4. UVALive 2323 Modular Multiplication of Polynomials(模拟)

    这是一个相对简单的模拟,因为运算规则已经告诉了我们,并且比较简单,不要被吓到…… 思路:多项式除以另外一个多项式,如果能除,那么他的最高次一定被降低了,如果最高次不能被降低,那说明已经无法被除,就是题 ...

  5. Lintcode: Hash Function && Summary: Modular Multiplication, Addition, Power && Summary: 长整形long

    In data structure Hash, hash function is used to convert a string(or any other type) into an integer ...

  6. POJ题目排序的Java程序

    POJ 排序的思想就是根据选取范围的题目的totalSubmittedNumber和totalAcceptedNumber计算一个avgAcceptRate. 每一道题都有一个value,value ...

  7. A过的题目

    1.TreeMap和TreeSet类:A - Language of FatMouse ZOJ1109B - For Fans of Statistics URAL 1613 C - Hardwood ...

  8. POJ题目细究

    acm之pku题目分类 对ACM有兴趣的同学们可以看看 DP:  1011   NTA                 简单题  1013   Great Equipment     简单题  102 ...

  9. 【转】POJ百道水题列表

    以下是poj百道水题,新手可以考虑从这里刷起 搜索1002 Fire Net1004 Anagrams by Stack1005 Jugs1008 Gnome Tetravex1091 Knight ...

随机推荐

  1. 问题:Oracle 树形遍历;结果:使用oracle进行遍历树操作

    使用oracle进行遍历树操作   1:首先数据库中表必须是树形结构的 2:super_department_id 为 department_id 的父节点编号 3:以下语句的执行结果是:depart ...

  2. LAMP 2.7 Apache通过rewrite限制某个目录

    我们可以 allow 和 deny 去现在网站根目录下的某个子目录,当然这个 rewrite 也可以实现,配置如下: 创建一个目录和文件随便写些东西 mkdir /data/www/data/tmp ...

  3. 【转载】你知道 Linux 内核是如何构建的吗?

    内核的根 Makefile 负责构建两个主要的文件:vmlinux (内核镜像可执行文件)和模块文件.内核的 Makefile 从定义如下变量开始: VERSION = PATCHLEVEL = SU ...

  4. Anaconda 安装教程(Win10环境) Tensorflow安装

    序 Python易用,但用好却不易,其中比较头疼的就是包管理和Python不同版本的问题,特别是当你使用Windows的时候.为了解决这些问题,有不少发行版的Python,比如WinPython.An ...

  5. Android排错: has leaked window com.android.internal.policy.impl.PhoneWindow$ that was originally added here

    异常场景: 经常在应用中需要处理一些耗时的工作,诸如读取大文件.访问网络资源等.为了避免因程序假死而带来的糟糕用户体验,通常我们可以通过线程+Handler或者Android提供的AsyncTask来 ...

  6. Web访问中的角色与协议

  7. win10获取超级管理员权限脚本实现

    建立一个TXT文件,把下面的脚本贴到里面,然后把后缀改成reg格式,双击添加到注册表就可以了, win10_1703版本亲测可用.... Windows Registry Editor Version ...

  8. keystone组件

    引:  什么是keystone    为何要有keystone     keystone的功能     keystone概念详解     keystone与openstack其他组件关系      k ...

  9. Python--详解TKinter类库

    为了学习python3.5的tkinter,于是我去官网找了找相关部件的一些文档,读起来有点绕口,觉得还是自己来实践实践,看看视频感觉用处会更大,然后就有了下面的一部分常用的总结, 查看tkinter ...

  10. TCP/IP的三次握手和四次放手

    一开始个人对于三次握手和四次挥手这个东西还是有时候会忘记,可能理解的不是非常深刻,所以今天就自己动手来记录一下这个知识点,方便以后查看.总结完之后发现总结的还是可以的哈哈. 三次握手建立连接 第一次: ...