题目链接
http://acm.hdu.edu.cn/showproblem.php?pid=4447
一个很恶心的数学规律加大模拟,对拍了一下午,但多项式的除法有必要写一个板子。
题意:题意很简单,x^n-1因式分解,分解成若干个多项式相乘,分到不能分为止
思路:
仅次于当场防AK的瞎搞题。规律抠自某会议的论文。
x^n-1可以分解为n的所有因子对应的多项式相乘和o§,
其中 p(1) = x – 1,
那p(2) 就是 (x^2-1) / p(1), (p(1) * p(2) *o§== pow(x,2) - 1)
p(3) 就是 (x^3-1) / p(1),(p(1)*p(3) *o§==pow(x,3)-1)
p(5)就是(x^5-1) / p(1) 以此类推。
o§为上面每一个除法对应的不能再分解的。
所以可以先模拟多项式除法,预处理一下每一个p(i),然后分解因数。
#include <bits/stdc++.h>
using namespace std;
const int maxn = 1e3 + 105;
class Polynomial {
public:
int a[maxn];
int maxp;
Polynomial();
Polynomial(const Polynomial& p);
void setxn_1(int n);
void outputpl();
Polynomial operator / (const Polynomial& p) const;
bool operator < (const Polynomial& p) const;
Polynomial& operator = (const Polynomial& p);
};
Polynomial::Polynomial(const Polynomial& p) {
memset(a, 0, sizeof(a));
maxp = p.maxp;
for (int i = 0; i <= maxp; i++)
a[i] = p.a[i];
}
Polynomial& Polynomial::operator = (const Polynomial& p) {
memset(a, 0, sizeof(a));
maxp = p.maxp;
for (int i = 0; i <= maxp; i++)
a[i] = p.a[i];
return *this;
}
bool Polynomial::operator < (const Polynomial& p) const{
if (maxp != p.maxp) return maxp < p.maxp;
for (int i = maxp; i >= 0 ; i--) {
if (abs(a[i]) != abs(p.a[i]))
return abs(a[i]) < abs(p.a[i]);
else if (a[i] != p.a[i])
return a[i] < 0;
}
return true;
}
Polynomial Polynomial:: operator / (const Polynomial& p) const{
Polynomial ans;
Polynomial This = *this;
ans.maxp = This.maxp - p.maxp;
int pos = ans.maxp;
for (int i = This.maxp; i >= p.maxp; i--) {
ans.a[pos] = This.a[i] / p.a[p.maxp];
for (int j = p.maxp; j >= 0; j--) {
This.a[i + j - p.maxp] -= ans.a[pos] * p.a[j];
}
pos--;
}
return ans;
}
Polynomial::Polynomial() {
memset(a, 0, sizeof(a));
maxp = 0;
}
void Polynomial::setxn_1(int n) {
memset(a, 0, sizeof(a));
a[0] = -1;
a[n] = 1;
maxp = n;
}
void Polynomial::outputpl() {
int flag = 1;
for (int i = maxp; i >= 1; i--) {
if (a[i]) {
if (!flag) {
if (a[i] > 0) printf("+");
}
if (abs(a[i]) >= 2)
printf("%d", a[i]);
else if (a[i] == -1)
printf("-");
if (i >= 2)
printf("x^%d", i);
else printf("x");
flag = 0;
}
}
if (a[0]) {
if (a[0] > 0 && maxp)
printf("+");
printf("%d", a[0]);
}
}
Polynomial p[maxn];
int main() {
int n;
p[1].setxn_1(1);
for (int num = 2; num < maxn; num++) {
stack<int> temp;
p[num].setxn_1(num);
for (int i = 1; i < num; i++)
if (num % i == 0)
temp.push(i);
while (!temp.empty()) {
p[num] = p[num] / p[temp.top()];
temp.pop();
}
}
while (cin >> n && n) {
queue<int> q;
vector<Polynomial> ans;
for (int i = 1; i <= n; i++) {
if (n % i == 0)
ans.push_back(p[i]);
}
if (n == 1)
printf("x-1");
else {
sort(ans.begin(), ans.end());
for (int i = 0; i < ans.size(); i++) {
printf("("); ans[i].outputpl(); printf(")");
}
}
printf("\n");
}
return 0;
}