/* by Neptune*/
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <vector>
#include <string>
#include <sstream>
#include <cstring>
#include <algorithm>
#include <queue>
#include <map>
#include <set>
#include <stack>
#include <cmath>
#include <iomanip>
#include <unordered_map>
#include <cstdlib>
#include <bitset>
#include <numeric>
#include <unordered_set>
using namespace std;
#define faster() ios_base::sync_with_stdio(0); cin.tie(NULL); cout.tie(NULL);
int x[100] = { 0 };
vector<int> v;
vector<int> ans;
bool chiahet(vector<int> v, vector<int> u, int n) {
ans.clear();
while (true) {
int d = v[0] - u[0];
ans.push_back(d);
vector<int> c;
for (int i = 0; i < u.size(); i++) {
c.push_back(u[i] + d);
}
int i = 0;
int j = 0;
vector<int> res;
while (i < v.size() && j < c.size()) {
if (v[i] == c[j]) {
i++;
j++;
}
else if (v[i] < c[j]) {
res.push_back(c[j]);
j++;
}
else if (v[i] > c[j]) {
res.push_back(v[i]);
i++;
}
}
while (i < v.size()) res.push_back(v[i++]);
while (j < c.size()) res.push_back(c[j++]);
sort(res.begin(), res.end(), greater<int>());
v = res;
if (v.empty()) return true;
if (!v.empty() && v[0] < u[0]) return false;
}
}
void kiemtra(int n) {
vector<int> u;
u.push_back(n + 1);
for (int i = n; i >= 1; i--) {
if (x[i]) u.push_back(i);
}
u.push_back(0);
while (!v.empty() && chiahet(v, u, n)) {
v = ans;
for (auto x : u) {
if (x == 0) cout << 1;
else
if (x == 1) cout << "x + ";
else
cout << "x^" << x << " + ";
}
cout << endl;
}
}
void sinh_nhi_phan(int i, int n) {
if (v.empty()) return;
for (int j = 0; j <= 1; j++) {
x[i] = j;
if (i == n) kiemtra(n);
else sinh_nhi_phan(i + 1, n);
}
}
int main() {
cout << "Phan tich x^n + 1 thanh cac da thuc bat kha quy\n";
cout << "Nhap n: ";
int n;
cin >> n;
v.push_back(n);
v.push_back(0);
for (int i = 1; i <= n - 1; i++) {
if (v[0] == 0) break;
if (i >= 2) sinh_nhi_phan(1, i - 1);
else if (i == 1) kiemtra(0);
}
//for (auto x : v) cout << x << " - ";
return 0;
}
LyogYnkgTmVwdHVuZSovCiNkZWZpbmUgX0NSVF9TRUNVUkVfTk9fV0FSTklOR1MKI2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dmVjdG9yPgojaW5jbHVkZSA8c3RyaW5nPgojaW5jbHVkZSA8c3N0cmVhbT4KI2luY2x1ZGUgPGNzdHJpbmc+CiNpbmNsdWRlIDxhbGdvcml0aG0+CiNpbmNsdWRlIDxxdWV1ZT4KI2luY2x1ZGUgPG1hcD4KI2luY2x1ZGUgPHNldD4KI2luY2x1ZGUgPHN0YWNrPgojaW5jbHVkZSA8Y21hdGg+CiNpbmNsdWRlIDxpb21hbmlwPgojaW5jbHVkZSA8dW5vcmRlcmVkX21hcD4KI2luY2x1ZGUgPGNzdGRsaWI+CiNpbmNsdWRlIDxiaXRzZXQ+CiNpbmNsdWRlIDxudW1lcmljPgojaW5jbHVkZSA8dW5vcmRlcmVkX3NldD4KdXNpbmcgbmFtZXNwYWNlIHN0ZDsKCiNkZWZpbmUgZmFzdGVyKCkgaW9zX2Jhc2U6OnN5bmNfd2l0aF9zdGRpbygwKTsgY2luLnRpZShOVUxMKTsgY291dC50aWUoTlVMTCk7CgppbnQgeFsxMDBdID0geyAwIH07CnZlY3RvcjxpbnQ+IHY7CnZlY3RvcjxpbnQ+IGFuczsKCmJvb2wgY2hpYWhldCh2ZWN0b3I8aW50PiB2LCB2ZWN0b3I8aW50PiB1LCBpbnQgbikgewoJYW5zLmNsZWFyKCk7Cgl3aGlsZSAodHJ1ZSkgewoJCWludCBkID0gdlswXSAtIHVbMF07CgkJYW5zLnB1c2hfYmFjayhkKTsKCgkJdmVjdG9yPGludD4gYzsKCQlmb3IgKGludCBpID0gMDsgaSA8IHUuc2l6ZSgpOyBpKyspIHsKCQkJYy5wdXNoX2JhY2sodVtpXSArIGQpOwoJCX0KCgkJaW50IGkgPSAwOwoJCWludCBqID0gMDsKCQl2ZWN0b3I8aW50PiByZXM7CgkJd2hpbGUgKGkgPCB2LnNpemUoKSAmJiBqIDwgYy5zaXplKCkpIHsKCQkJaWYgKHZbaV0gPT0gY1tqXSkgewoJCQkJaSsrOwoJCQkJaisrOwoJCQl9CgkJCWVsc2UgaWYgKHZbaV0gPCBjW2pdKSB7CgkJCQlyZXMucHVzaF9iYWNrKGNbal0pOwoJCQkJaisrOwoJCQl9CgkJCWVsc2UgaWYgKHZbaV0gPiBjW2pdKSB7CgkJCQlyZXMucHVzaF9iYWNrKHZbaV0pOwoJCQkJaSsrOwoJCQl9CgkJfQoJCXdoaWxlIChpIDwgdi5zaXplKCkpIHJlcy5wdXNoX2JhY2sodltpKytdKTsKCQl3aGlsZSAoaiA8IGMuc2l6ZSgpKSByZXMucHVzaF9iYWNrKGNbaisrXSk7CgoJCXNvcnQocmVzLmJlZ2luKCksIHJlcy5lbmQoKSwgZ3JlYXRlcjxpbnQ+KCkpOwoJCXYgPSByZXM7CgkJaWYgKHYuZW1wdHkoKSkgcmV0dXJuIHRydWU7CgkJaWYgKCF2LmVtcHR5KCkgJiYgdlswXSA8IHVbMF0pIHJldHVybiBmYWxzZTsKCX0KfQoKdm9pZCBraWVtdHJhKGludCBuKSB7CgkKCXZlY3RvcjxpbnQ+IHU7Cgl1LnB1c2hfYmFjayhuICsgMSk7Cglmb3IgKGludCBpID0gbjsgaSA+PSAxOyBpLS0pIHsKCQlpZiAoeFtpXSkgdS5wdXNoX2JhY2soaSk7Cgl9Cgl1LnB1c2hfYmFjaygwKTsKCXdoaWxlICghdi5lbXB0eSgpICYmIGNoaWFoZXQodiwgdSwgbikpIHsKCQl2ID0gYW5zOwoJCWZvciAoYXV0byB4IDogdSkgewoJCQlpZiAoeCA9PSAwKSBjb3V0IDw8IDE7CgkJCWVsc2UKCQkJCWlmICh4ID09IDEpIGNvdXQgPDwgInggKyAiOwoJCQkJZWxzZQoJCQkJCWNvdXQgPDwgInheIiA8PCB4IDw8ICIgKyAiOwoJCX0KCQljb3V0IDw8IGVuZGw7Cgl9Cn0KCnZvaWQgc2luaF9uaGlfcGhhbihpbnQgaSwgaW50IG4pIHsKCWlmICh2LmVtcHR5KCkpIHJldHVybjsKCWZvciAoaW50IGogPSAwOyBqIDw9IDE7IGorKykgewoJCXhbaV0gPSBqOwoJCWlmIChpID09IG4pIGtpZW10cmEobik7CgkJZWxzZSBzaW5oX25oaV9waGFuKGkgKyAxLCBuKTsKCX0KfQppbnQgbWFpbigpIHsKCWNvdXQgPDwgIlBoYW4gdGljaCB4Xm4gKyAxIHRoYW5oIGNhYyBkYSB0aHVjIGJhdCBraGEgcXV5XG4iOwoJY291dCA8PCAiTmhhcCBuOiAiOwoJaW50IG47CgljaW4gPj4gbjsKCgl2LnB1c2hfYmFjayhuKTsKCXYucHVzaF9iYWNrKDApOwoKCWZvciAoaW50IGkgPSAxOyBpIDw9IG4gLSAxOyBpKyspIHsKCQlpZiAodlswXSA9PSAwKSBicmVhazsKCQlpZiAoaSA+PSAyKSBzaW5oX25oaV9waGFuKDEsIGkgLSAxKTsKCQllbHNlIGlmIChpID09IDEpIGtpZW10cmEoMCk7Cgl9CgoJLy9mb3IgKGF1dG8geCA6IHYpIGNvdXQgPDwgeCA8PCAiIC0gIjsKCglyZXR1cm4gMDsKfQ==