【HDOJ】4516 威威猫系列故事——因式分解
可解的算法太多了,采用的算法是试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 威威猫系列故事——因式分解的更多相关文章
- hdoj 4526 威威猫系列故事——拼车记
威威猫系列故事——拼车记 Time Limit: 500/200 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Others)Total ...
- HDU 4540 威威猫系列故事——打地鼠
威威猫系列故事--打地鼠 Time Limit: 300/100 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Others) Total Su ...
- hdu 4523 威威猫系列故事——过生日 小模拟
威威猫系列故事——过生日 Time Limit: 500/200 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Others) Total ...
- hdu 4540 威威猫系列故事——打地鼠 dp小水题
威威猫系列故事——打地鼠 Time Limit: 300/100 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Others) Total ...
- HDU--杭电--4504--威威猫系列故事——篮球梦--DP
威威猫系列故事——篮球梦 Time Limit: 300/100 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Others) Total ...
- HDU 4540 威威猫系列故事——打地鼠 (状态压缩DP)
威威猫系列故事——打地鼠 Time Limit: 300/100 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Others)Total ...
- HDUOJ----4504 威威猫系列故事——篮球梦
威威猫系列故事——篮球梦 Time Limit: 300/100 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Others)Total ...
- HDOJ(HDU).4508 湫湫系列故事――减肥记I (DP 完全背包)
HDOJ(HDU).4508 湫湫系列故事――减肥记I (DP 完全背包) 题意分析 裸完全背包 代码总览 #include <iostream> #include <cstdio& ...
- Hdoj 4540.威威猫系列故事——打地鼠 题解
Problem Description 威威猫最近不务正业,每天沉迷于游戏"打地鼠". 每当朋友们劝他别太着迷游戏,应该好好工作的时候,他总是说,我是威威猫,猫打老鼠就是我的工作! ...
随机推荐
- 第一篇、CSS3_transtion的使用
<html> <head> <title>这是一个CSS3的特性</title> <style> #box{ width: 150px; h ...
- Objective-C 学习笔记(Day 3,上)
------------------------------------------- 类方法 ①类方法: + 开头的方法(定义的过程形式和对象方法一样,只不过 + 开头,这是唯一的 ...
- Android笔记之adb命令应用实例1(手机端与PC端socket通讯上)
Android端的代码: 布局文件:activity_main.xml <LinearLayout xmlns:android="http://schemas.android.com/ ...
- css3中的BFC,IFC,GFC和FFC(转载)
作者原文网址:http://www.cnblogs.com/dingyufenglian/p/4845477.html What‘s FC? 一定不是KFC,FC的全称是:Formatting C ...
- java包和jar包
1.包 package pack; /*定义包,放在程序的第一行,包名所以字母小写*/ class PackageDemo{ publi ...
- Project Israfil -- 支持多个音乐平台的开源音乐服务
Israfil |关于|当前进度|开发日志|下载软件|编译|参与项目|编译状态|版权|协议| LER0ever Project Israfil Provide Unified Music Se ...
- Django部署问题
1.Debug=True页面正常显示. 2.Debug=False,页面500错误. 3.解决500,配置setting.py,令ALLOWED_HOSTS = ['*'],可解决访问问题,但静态文件 ...
- mysql中的sql时间格式转换
from_unixtime(unix_timestamp, format) 把时间戳转化为指定的格式 as: select from_unixtime(addTime, '%Y-%m-%d %h:%i ...
- C语言到底怎么了?
自2015年11月开始,所有C语言系列都呈现出衰落之势.在超过15年的时间里,C语言在编程语言排行榜中的占比一直有15%-20%,但今年却突然急转直下,目前占比已不足10%,且目前看来回天乏力. 那么 ...
- ECSHOP订单一键发货简化订单发货流程
第一步: 在templates/order_info.htm文件找到: {if $operable_list.confirm} <input name="confirm&q ...