可解的算法太多了,采用的算法是试x的值。注意题目的输入x^3-2x^2不会写成x^3+-2x^2。一直RE在这儿。
1 /* 4516 */ 2 #include <iostream> 3 #include <string> 4 #include <map> 5 #include <queue> 6 #include <set> 7 #include <stack> 8 #include <vector> 9 #include <deque> 10 #include <algorithm> 11 #include <cstdio> 12 #include <cmath> 13 #include <ctime> 14 #include <cstring> 15 #include <climits> 16 #include <cctype> 17 #include <cassert> 18 #include <functional> 19 #include <iterator> 20 #include <iomanip> 21 using namespace std; 22 //#pragma comment(linker,"/STACK:102400000,1024000") 23 24 #define sti set<int> 25 #define stpii set<pair<int, int> > 26 #define mpii map<int,int> 27 #define vi vector<int> 28 #define pii pair<int,int> 29 #define vpii vector<pair<int,int> > 30 #define rep(i, a, n) for (int i=a;i<n;++i) 31 #define per(i, a, n) for (int i=n-1;i>=a;--i) 32 #define clr clear 33 #define pb push_back 34 #define mp make_pair 35 #define fir first 36 #define sec second 37 #define all(x) (x).begin(),(x).end() 38 #define SZ(x) ((int)(x).size()) 39 #define lson l, mid, rt<<1 40 #define rson mid+1, r, rt<<1|1 41 #define LL long long 42 43 const int maxl = 505; 44 const int maxn = 10; 45 char s[maxl], ss[maxl]; 46 int A[40][maxn], B[maxn], B_[maxn]; 47 int c[maxn], cn; 48 49 bool check() { 50 memset(B, 0, sizeof(B)); 51 B[1] = 1; 52 B[0] = c[0]; 53 54 rep(i, 1, cn) { 55 memset(B_, 0, sizeof(B_)); 56 rep(j, 1, maxn) 57 B_[j] += B[j-1]; 58 rep(j, 0, maxn) 59 B_[j] += B[j] * c[i]; 60 memcpy(B, B_, sizeof(B)); 61 } 62 63 rep(i, 0, maxn) { 64 if (A[0][i] != B[i]) 65 return false; 66 } 67 68 return true; 69 } 70 71 bool judge(int p, int i, int x) { 72 LL ret = 0, base = 1; 73 74 for (int j=0; j<=i; ++j) { 75 ret += A[p][j] * base; 76 base *= x; 77 } 78 79 return ret == 0; 80 } 81 82 void reduce(int p, int i, int x) { 83 int q = p + 1; 84 85 memcpy(B, A[p], sizeof(B)); 86 for (int j=i; j>0; --j) { 87 A[q][j-1] = B[j]; 88 B[j-1] -= B[j] * x; 89 } 90 } 91 92 bool solve() { 93 // init parameter 94 int i = 0, a = 0, p = 0, q; 95 int cnt = 0; 96 bool neg = false, flag = false; 97 98 memset(A, 0, sizeof(A)); 99 cn = 0; 100 101 while (1) { 102 if (s[i]=='+' || s[i]=='