Description

题目描述

You are given an polynomial of x consisting of only addition marks, multiplication marks, brackets, single digit numbers, and of course the letter x. For example, a valid polynomial would be: (1+x)*(1+x*x+x+5)+1*x*x.

You are required to write the polynomial into it's minimal form by combining the equal terms.

For example, (1+x)*(1+x) would be written as x^2+2*x+1.

Also, (1+x)*(1+x*x+x+5)+1*x*x would be written as x^3+3*x^2+7*x+6.

给你一个由加号、乘号、括号、一位数以及未知数x组成的多项式。例如,一个有效多项式可以是:(1+x)*(1+x*x+x+5)+1*x*x。

现在你需要写出与原式等价的最小多项式形式。

例如,(1+x)*(1+x)应该改写成x^2+2*x+1。

同理,(1+x)*(1+x*x+x+5)+1*x*x 应该改写成x^3+3*x^2+7*x+6。

Input

输入

The first line contains an integer T, meaning the number of the cases. 1 <= T <= 50.

For each test case, there will be one polynomial which it's length would be not larger than 1000.

It is guaranteed that every input polynomial is valid, and every number would be a single digit.

输入的首行是一个整数T,表示测试样例的数量。1 <= T <= 50。

对于每个测试样例,都有一个长度不超过1000的多项式。

保证输入字符串均有效,并且所有数字都是一位数。

Output

输出

For each polynomial, output it's minimal form. If the polynomial's minimal form has n terms, output n space-separated integers.

You only have to output each term's corresponding constant (from highest to lowest). In case the constant gets too big, output the remainder of dividing the answer by 1000000007 (1e9 + 7).

输出每个多项式的最小形式。如果最小多项式有n项,则输出n个用空格分隔的整数。

你只要输出每项对应的系数(从高到低)。为防止输出过大,输出的结果模1000000007(1e9 + 7)。

Sample Input - 输入样例

Sample Output - 输出样例

4

1*(1+1*(1+1))

(1+x)*(1+x)

x*((1+x)*(1+x*x+x+5)+1*x*x)

(x*x*x*0+x*2)*x

3

1 2 1

1 3 7 6 0

2 0 0

【题解】

类似表达式求值的做法,表达式求值分为数字栈和符号栈,这里的区别就是把数字栈换成多项式栈。当然,由于储存方式的不同,写法也不唯一。

需要注意的是运算时候数据是否溢出。

【代码 C++】

下面贴出代码版本比较原始,不过个人认为可读性比较好,算法简单。当然留了优化的空间,有兴趣(强迫症)可以试试……

注意,因为下面代码中使用的gets()由于不安全,C11标准中删除了gets(),使用一个新的更安全的函数gets_s()替代。

 #include<cstdio>
#include<cstring>
__int64 polynomial[][], mi, pi;
char data[], mark[], *di;
bool j_mark(){
switch (*di){
case : return ;
case '(': return ;
case ')': return ;
case '+':
if (mark[mi] == '*' || mark[mi] == '+') return ;
else return ;
case '*':
if (mark[mi] == '*') return ;
return ;
default: return ;
}
}
bool j_count(){
switch (*di){
case : return mark[mi] ? : ;
case ')':
if (mark[mi] != '(') return ;
--mi;
return ;
case '+':
if (mark[mi] == '*' || mark[mi] == '+') return ;
mark[++mi] = '+';
return ;
case '*':
if (mark[mi] == '*') return ;
mark[++mi] = '*';
return ;
default: return ;
}
}
void count(){
__int64 temp[];
memset(temp, , sizeof(temp));
if (mark[mi] == '+'){
for (int i = ; i <= ; ++i)
temp[i] = (polynomial[pi][i] + polynomial[pi - ][i]) % ;
}
else{
int i, j;
for (i = ; i <= ; ++i){
if (!polynomial[pi][i]) continue;
for (j = ; j <= ; ++j){
if (!polynomial[pi - ][j]) continue;
temp[i + j] += (polynomial[pi][i] * polynomial[pi - ][j]) % ;
temp[i + j] %= ;
}
}
}
--pi; --mi;
memcpy(polynomial[pi], temp, sizeof(temp));
return;
}
void opt(){
int st = ;
while (st){
if (!polynomial[][st]) --st;
else break;
}
printf("%d", polynomial[][st]);
for (--st; ~st; --st) printf(" %d", polynomial[][st]);
puts("");
return;
}
int main(){
int T;
scanf("%d", &T); getchar();
while (T--){
pi = -; mark[] = mi = ;
for (gets(data), di = data; true; ++di){
if (*di < ''){//符号
if (j_mark()) mark[++mi] = *di;
else{
while (j_count()) count();
}
}
else{
++pi;
memset(polynomial[pi], , sizeof(polynomial[pi]));
if (*di > '') polynomial[pi][] = ;
else polynomial[pi][] = *di - '';
}
if (!*di) break;
}
opt();
}
return ;
}

FZU 2215

FZU 2215

FZU 2215 Simple Polynomial Problem(简单多项式问题)的更多相关文章

  1. hdu------(1757)A Simple Math Problem(简单矩阵快速幂)

    A Simple Math Problem Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Ot ...

  2. FZU - 2218 Simple String Problem(状压dp)

    Simple String Problem Recently, you have found your interest in string theory. Here is an interestin ...

  3. FZU 2218 Simple String Problem(简单字符串问题)

    Description 题目描述 Recently, you have found your interest in string theory. Here is an interesting que ...

  4. FZU - 2218 Simple String Problem 状压dp

    FZU - 2218Simple String Problem 题目大意:给一个长度为n含有k个不同字母的串,从中挑选出两个连续的子串,要求两个子串中含有不同的字符,问这样的两个子串长度乘积最大是多少 ...

  5. FZU2215 Simple Polynomial Problem(中缀表达求值)

    比赛时没做出这题太可惜了. 赛后才反应过来这就是个中缀表达式求值,数字栈存的不是数字而是多项式. 而且,中缀表达式求值很水的,几行就可以搞定. #include<cstdio> #incl ...

  6. 一起啃PRML - 1.1 Example: Polynomial Curve Fitting 多项式曲线拟合

    一起啃PRML - 1.1 Example: Polynomial Curve Fitting @copyright 转载请注明出处 http://www.cnblogs.com/chxer/ 前言: ...

  7. BZOJ 3489: A simple rmq problem

    3489: A simple rmq problem Time Limit: 40 Sec  Memory Limit: 600 MBSubmit: 1594  Solved: 520[Submit] ...

  8. hdu4976 A simple greedy problem. (贪心+DP)

    http://acm.hdu.edu.cn/showproblem.php?pid=4976 2014 Multi-University Training Contest 10 1006 A simp ...

  9. HDU 5795 A Simple Nim(简单Nim)

    p.MsoNormal { margin: 0pt; margin-bottom: .0001pt; text-align: justify; font-family: Calibri; font-s ...

随机推荐

  1. 2.1:你的第一个AngularJS App

    本章,带你体验一个简单的开发流程,将一个静态的使用模拟数据的应用,变成具有AngularJS特性的动态web应用.在6-8章,作者将展示如何创建一个更复杂,更真实的AngularJS应用. 1.准备项 ...

  2. CentOS 7 更新源 – 使用国内 163 yum 源

    突然想起试试 Docker,在一台计算机上安装了 CentOS 7,准备开工,突然想起还需要做一件事情,更改源,不然安装肯定会很慢,网上搜索了一下,文章很多,但是会出一些问题,所以将自己的成功的日志写 ...

  3. rsync增量传输大文件优化技巧

    问题 rsync用来同步数据非常的好用,特别是增量同步.但是有一种情况如果不增加特定的参数就不是很好用了.比如你要同步多个几十个G的文件,然后网络突然断开了一下,这时候你重新启动增量同步.但是发现等了 ...

  4. 6、XML(2)

    1 总结XML基础 XML基础 1)XML的作用 1.1 作为软件配置文件 1.2 作为小型的"数据库" 2)XML语法(由w3c组织规定的) 标签: 标签名不能以数字开头,中间不 ...

  5. ectouch第五讲 之表

    Ectouch本身相关的表 17个ecs_touch_activity[touch优惠活动扩展表] 优惠活动的自增id 取值ecs_favourable_activity表cat_id,给优惠活动加b ...

  6. Zend Studio实用快捷键一览表

    CTRL+B | 重构项目CTRL+D | 删除一行CTRL+E | 搜索已打开的文件名CTRL+F | 打开本文件的搜索/替换 ,只搜索当前文件CTRL+H | 打开搜索替换窗口 ,可搜索整个磁盘. ...

  7. 给我发邮件(qq)| 和我联系

    qq邮箱开放平台(只能是qq对qq): 简单点的发邮件: 和我联系

  8. xUtils框架

    我要为大家推荐的是一个Android基于快速开发的一个框架——xUtils,它是在aFinal基础上进行重构和扩展的框架,相比aFinal有很大的改善.同时,如果如果你的应用是基于网络的,那么只要处理 ...

  9. YTU 2973: C语言习题5.25--文件操作2

    2973: C语言习题5.25--文件操作2 时间限制: 1 Sec  内存限制: 128 MB 提交: 242  解决: 105 题目描述 文本文件score.dic 中存储了n名学生的信息(班级编 ...

  10. Webstrom快捷键大全

    20:32:59 Ctrl+/ 或 Ctrl+Shift+/          注释(// 或者 ) Shift+F6               重构-重命名 Ctrl+X             ...