可解的算法太多了,采用的算法是试x的值。注意题目的输入x^3-2x^2不会写成x^3+-2x^2。一直RE在这儿。

 /* 4516 */
#include <iostream>
#include <string>
#include <map>
#include <queue>
#include <set>
#include <stack>
#include <vector>
#include <deque>
#include <algorithm>
#include <cstdio>
#include <cmath>
#include <ctime>
#include <cstring>
#include <climits>
#include <cctype>
#include <cassert>
#include <functional>
#include <iterator>
#include <iomanip>
using namespace std;
//#pragma comment(linker,"/STACK:102400000,1024000") #define sti set<int>
#define stpii set<pair<int, int> >
#define mpii map<int,int>
#define vi vector<int>
#define pii pair<int,int>
#define vpii vector<pair<int,int> >
#define rep(i, a, n) for (int i=a;i<n;++i)
#define per(i, a, n) for (int i=n-1;i>=a;--i)
#define clr clear
#define pb push_back
#define mp make_pair
#define fir first
#define sec second
#define all(x) (x).begin(),(x).end()
#define SZ(x) ((int)(x).size())
#define lson l, mid, rt<<1
#define rson mid+1, r, rt<<1|1
#define LL long long const int maxl = ;
const int maxn = ;
char s[maxl], ss[maxl];
int A[][maxn], B[maxn], B_[maxn];
int c[maxn], cn; bool check() {
memset(B, , sizeof(B));
B[] = ;
B[] = c[]; rep(i, , cn) {
memset(B_, , sizeof(B_));
rep(j, , maxn)
B_[j] += B[j-];
rep(j, , maxn)
B_[j] += B[j] * c[i];
memcpy(B, B_, sizeof(B));
} rep(i, , maxn) {
if (A[][i] != B[i])
return false;
} return true;
} bool judge(int p, int i, int x) {
LL ret = , base = ; for (int j=; j<=i; ++j) {
ret += A[p][j] * base;
base *= x;
} return ret == ;
} void reduce(int p, int i, int x) {
int q = p + ; memcpy(B, A[p], sizeof(B));
for (int j=i; j>; --j) {
A[q][j-] = B[j];
B[j-] -= B[j] * x;
}
} bool solve() {
// init parameter
int i = , a = , p = , q;
int cnt = ;
bool neg = false, flag = false; memset(A, , sizeof(A));
cn = ; while () {
if (s[i]=='+' || s[i]=='\0') {
if (neg)
a = -a;
if (flag && p==)
p = ;
A[][p] += a;
neg = false;
flag = false;
p = ;
a = ;
cnt = ;
} else if (s[i] == '-') {
neg = true;
} else if (s[i] == 'x') {
if (cnt == )
a = ;
flag = true;
} else if (s[i] == '^') {
;
} else {
if (flag)
p = p*+s[i]-'';
else
a = a*+s[i]-'';
++cnt;
}
if (s[i] == '\0')
break;
++i;
} p = , q = ;
int x, xx; while () {
for (i=; i>=; --i) {
if (A[p][i] != )
break;
}
if (i < )
break;
if (A[p][i] != )
return false;
if (i == )
break; a = A[p][];
if (a == ) {
c[cn] = ;
while (i > ) {
A[q][i-] = A[p][i];
--i;
}
flag = true;
} else if (a > ) {
flag = false;
for (x=; x*x<=a; ++x) {
if (a%x == ) {
if (judge(p, i, -x)) {
reduce(p, i, x);
flag = true;
c[cn] = x;
break;
} else if (judge(p, i, x)) {
reduce(p, i, -x);
flag = true;
c[cn] = -x;
break;
}
xx = a/x;
if (xx != x) {
if (judge(p, i, -xx)) {
reduce(p, i, xx);
flag = true;
c[cn] = xx;
break;
} else if (judge(p, i, xx)) {
reduce(p, i, -xx);
flag = true;
c[cn] = -xx;
break;
}
}
}
}
} else {
flag = false;
a = -a;
for (x=; x*x<=a; ++x) {
if (a%x == ) {
if (judge(p, i, x)) {
reduce(p, i, -x);
c[cn] = -x;
flag = true;
break;
} else if (judge(p, i, -x)) {
reduce(p, i, x);
c[cn] = x;
flag = true;
break;
}
xx = a/x;
if (xx != x) {
if (judge(p, i, xx)) {
reduce(p, i, -xx);
flag = true;
c[cn] = -xx;
break;
} else if (judge(p, i, -xx)) {
reduce(p, i, xx);
flag = true;
c[cn] = xx;
break;
}
}
}
}
} if (!flag)
return false; ++cn;
++p;
++q;
} return cn>;
} void change() {
int l = ;
int i = ;
int len = strlen(s); while (i < len) {
if (s[i] == '-') {
if (i && s[i-]!='+')
ss[l++] = '+';
}
ss[l++] = s[i++];
} ss[l] = '\0';
strcpy(s, ss);
} int main() {
ios::sync_with_stdio(false);
#ifndef ONLINE_JUDGE
freopen("data.in", "r", stdin);
freopen("data.out", "w", stdout);
#endif int t;
bool flag; scanf("%d", &t);
rep(tt, , t+) {
scanf("%s", s);
change();
flag = solve();
printf("Case #%d: ", tt);
if (flag) {
sort(c, c+cn);
rep(i, , cn) {
if (c[i] == )
printf("x");
else if (c[i] > )
printf("(x+%d)", c[i]);
else
printf("(x-%d)", -c[i]);
}
putchar('\n');
#ifndef ONLINE_JUDGE
if (!check())
puts("wrong");
#endif
} else {
puts("-1");
}
} #ifndef ONLINE_JUDGE
printf("time = %d.\n", (int)clock());
#endif return ;
}

测试数据和答案。

 from random import randint
import shutil def GenEle(k):
if k == 0:
return "x"
elif k>0:
return "(x+%d)" % (k)
else:
return "(x-%d)" % (-k) def GenLine():
src, ans = "", ""
k = randint(1, 5)
L = []
for i in xrange(k):
x = randint(-10, 10)
L.append(x)
L = sorted(L)
ans = "".join(map(GenEle, L))
a = [0 for i in xrange(6)]
a[1] = 1
a[0] = L[0]
for i in xrange(1, k):
b = [0 for j in xrange(6)]
for j in xrange(1, 6):
b[j] += a[j-1]
for j in xrange(0, 6):
b[j] += a[j] * L[i]
a = b
i = 5
while i>=0:
if a[i]>0:
break
i -= 1
srcList = []
while i>=0:
line = ""
if a[i] < 0:
line += "-"
a[i] = -a[i]
if i==0 or a[i]!=1:
line += str(a[i])
if i==1:
line += "x"
elif i>1:
line += "x^%d" % i
i -= 1
srcList.append(line)
src = "+".join(srcList)
return src, ans def GenDataIn():
bound = 10**2
ansList = []
with open("data.in", "w") as fout:
t = 50
fout.write("%d\n" % (t))
for tt in xrange(t):
line, ans = GenLine()
fout.write(line + "\n")
ansList.append(ans)
with open("F:\code_today\data.in", "w") as fout:
for i,ans in enumerate(ansList):
line = "Case #%d: %s\n" % (i+1, ans)
fout.write(line) def MovDataIn():
desFileName = "F:\workspace\cpp_hdoj\data.in"
shutil.copyfile("data.in", desFileName) if __name__ == "__main__":
GenDataIn()
MovDataIn()

【HDOJ】4516 威威猫系列故事——因式分解的更多相关文章

  1. hdoj 4526 威威猫系列故事——拼车记

    威威猫系列故事——拼车记 Time Limit: 500/200 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others)Total ...

  2. HDU 4540 威威猫系列故事——打地鼠

    威威猫系列故事--打地鼠 Time Limit: 300/100 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Others) Total Su ...

  3. hdu 4523 威威猫系列故事——过生日 小模拟

    威威猫系列故事——过生日 Time Limit: 500/200 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others) Total ...

  4. hdu 4540 威威猫系列故事——打地鼠 dp小水题

    威威猫系列故事——打地鼠 Time Limit: 300/100 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others) Total ...

  5. HDU--杭电--4504--威威猫系列故事——篮球梦--DP

    威威猫系列故事——篮球梦 Time Limit: 300/100 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others) Total ...

  6. HDU 4540 威威猫系列故事——打地鼠 (状态压缩DP)

    威威猫系列故事——打地鼠 Time Limit: 300/100 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others)Total ...

  7. HDUOJ----4504 威威猫系列故事——篮球梦

    威威猫系列故事——篮球梦 Time Limit: 300/100 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others)Total ...

  8. HDOJ(HDU).4508 湫湫系列故事――减肥记I (DP 完全背包)

    HDOJ(HDU).4508 湫湫系列故事――减肥记I (DP 完全背包) 题意分析 裸完全背包 代码总览 #include <iostream> #include <cstdio& ...

  9. Hdoj 4540.威威猫系列故事——打地鼠 题解

    Problem Description 威威猫最近不务正业,每天沉迷于游戏"打地鼠". 每当朋友们劝他别太着迷游戏,应该好好工作的时候,他总是说,我是威威猫,猫打老鼠就是我的工作! ...

随机推荐

  1. iOS -数据持久化之CoreData

    Core Data是iOS5之后才出现的一个框架,它提供了对象-关系映射(ORM)的功能,即能够将OC对象转化成数据,保存在SQLite数据库文件中,也能够将保存在数据库中的数据还原成OC对象.在此数 ...

  2. 9月18日,SQL学习基础1

    数据库管理和应用 Oltp是小型的管理,OLAP是大型的管理 开发的内容如触发器 数据库管理系统(Database Management System,简称为DBMS)是位于用户与操作系统之间的一层数 ...

  3. javascript Date类型 学习笔记

    1 创建一个新的日期对象,如果不带参数,则对象自动获得当前的日期和时间 var d = new Date() 2 如果需要指定特定的日期,则可以通过Date.parse() 或者 Date().UTC ...

  4. Java实战之03Spring-05Spring中的事务控制(基于AOP)

    五.Spring中的事务控制(基于AOP) 1.Spring中事务有关的接口 1.1.明确: JavaEE体系进行分层开发,事务处理位于业务层,Spring提供了分层设计业务层的事务处理解决方案 1. ...

  5. mysql innodb 数据打捞(二)innodb 页面打捞编程

    有了页面的结构和特征,需要编程实现数据库页面的打捞工作: 为了方便windows and linux 的通用,计划做成C语言的控制台应用,并且尽量只用ansi c;关于多线程,计划做成多线程的程序,最 ...

  6. OpenJudge 2802 小游戏 / Poj 1101 The Game

    1.链接地址: http://bailian.openjudge.cn/practice/2802 http://poj.org/problem?id=1101 2.题目: 总时间限制: 1000ms ...

  7. 第36条:坚持使用Override注解

    @Override 注解只能用在方法声明中,表示被注解的方法声明覆盖了超类型中的一个声明. @Target(ElementType.METHOD) @Retention(RetentionPolicy ...

  8. C# IO操作磁盘上的txt

    using System.IO; //写入并导出到磁盘 StreamWriter sw = new StreamWriter(@"H:\text.txt"); sw.WriteLi ...

  9. postal.js使用

    requirejs.config({ //默认情况下模块所在目录为js/lib baseUrl: './', //当模块id前缀为app时,他便由js/app加载模块文件 //这里设置的路径是相对与b ...

  10. 高性能IO设计的Reactor和Proactor模式(转)

    在高性能的I/O设计中,有两个比较著名的模式Reactor和Proactor模式,其中Reactor模式用于同步I/O,而Proactor运用于异步I/O操作. 在比较这两个模式之前,我们首先的搞明白 ...