日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

HDU-4516 威威猫系列故事——因式分解 多项式分解

發布時間:2025/4/16 编程问答 54 豆豆
生活随笔 收集整理的這篇文章主要介紹了 HDU-4516 威威猫系列故事——因式分解 多项式分解 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

題意:給定一個多項式,對其進行因式分解。

解法:由于多項式每一項系數絕對值不超過1000,由于最后解的形式為(x-a)(x-b)(x-c)(x-d)(x-e)其中a*b*c*d*e一定是最后的常數項系數,因此a, b, c, d, e的取值范圍都在[-1000, 1000]內,因此枚舉所有的根,剩下的就是重根的時候該怎么辦?一個解決辦法就是對原多項式進行求導,如果一個根t是f(x)的K重根的話,那么t一定是f(x)'的K-1重根。該題的字符串處理我沒寫好,后面調了很久。還有就是由于有5次方存在,因此代入時使用long long計算。

代碼如下:

#include <cstdlib> #include <cstring> #include <cstdio> #include <algorithm> #include <cctype> #include <vector> using namespace std;char str[500]; int seq[10];long long _pow(int a, int b) {long long ret = 1;for (int i = 0; i < b; ++i) {ret *= a;}return ret; }int jiechen[10] = {1, 1, 2, 6, 24, 120};void qiudao(int *rec, int k) {for (int i = k; i <= 5; ++i) {rec[i-k] = jiechen[i] / jiechen[i-k] * seq[i];} }bool judge(int rec[], int x) {long long sum = 0;for (int i = 0; i <= 5; ++i) {sum += 1LL * rec[i] * _pow(x, i);}return sum == 0; }void gao(char ts[]) {int len = strlen(ts);int p = -1, a, b;for (int i = 0; i < len; ++i) {if (ts[i] == 'x') {if (isdigit(ts[i-1])) { ts[i] = '\0';} else {ts[i] = '1';}p = -2;} else if (ts[i] == '^') {ts[i] = '\0';p = i+1; }}a = atoi(ts);if (!a && p != -1) a = 1;if (p == -1) {b = 0;} else if (p == -2) {b = 1;}else {b = atoi(ts+p);}seq[b] += a; }void solve() {vector<int>v;int cnt = 0;memset(seq, 0, sizeof (seq));char ts[50], *p;p = strtok(str, "+");while (p) {strcpy(ts, p);gao(ts);p = strtok(NULL, "+");}for (int i = 5; i >= 0; --i) {if (seq[i] != 0) {cnt = i;break;}}for (int i = -1000; i <= 1000; ++i) { for (int j = 0; j < cnt; ++j) {int rec[10] = {0};qiudao(rec, j);if (judge(rec, i)) {v.push_back(i);} else {break;}}}//x^4-x^2//x^4-7x^3+18x^2-20x+8//x^3-13x^2+55x-75//x^2+5x^2-6x^2+x^2+2x-20x+30x-10x+8-7//x^5-10x^4+39x^3-74x^2+68x-24//以上都是能夠分解的式子 if (v.size() != cnt || seq[cnt] != 1 || cnt == 0) {printf("-1\n");} else {sort(v.begin(), v.end());for (int i = v.size()-1; i >= 0; --i) {if (v[i] < 0) {printf("(x+%d)", -v[i]);} else if (v[i] == 0) {printf("x"); } else {printf("(x-%d)", v[i]); }}puts("");} }int main() {int T, ca = 0;scanf("%d", &T);while (T--) {scanf("%s", str);int len = strlen(str);for (int i = 0; i < len; ++i) {if (str[i] == '-') {for (int j = len-1; j >= i; --j) {str[j+1] = str[j];}str[i] = '+';len += 1;++i;str[len] = '\0';}}printf("Case #%d: ", ++ca);solve();}return 0; }

?

轉載于:https://www.cnblogs.com/Lyush/archive/2013/03/24/2978239.html

總結

以上是生活随笔為你收集整理的HDU-4516 威威猫系列故事——因式分解 多项式分解的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。