Помогите решить(поделится идеей решения) данной задачи
Не проходит 16 тест
Кубическое уравнение (Время: 1 сек. Память: 16 Мб Сложность: 56%) Напишите программу, которая будет искать все целые X, удовлетворяющие уравнению AX3 + BX2 + C*X + D = 0, где A, B, C, D – заданные целые коэффициенты.
Входные данные Во входном файле INPUT.TXT записаны четыре целых числа: A, B, C, D. Все числа по модулю не превышают 2×109.
Выходные данные В выходной файл OUTPUT.TXT выведите сначала количество различных корней этого уравнения в целых числах, а затем сами корни в возрастающем порядке. Если уравнение имеет бесконечно много корней, то следует вывести в выходной файл одно число -1 (минус один).
Задача на acmp ru под номером 257
Мой код:
https://pastebin.com/ajaexiek
Я ищу делители числа d и по ним отбираю корни, так же я рассмотрел все случаи когда коэффициенты равен(равны) нулю
Код здесь:
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
vector <ll> s;
ll check(ll n, ll a, ll b, ll c, ll d){
return (a*n*n*n+b*n*n+c*n+d);
}
void poisk(ll n, ll a, ll b, ll c, ll d){
for (ll i = 1; i*i <= abs(n); i++){
if (n % i == 0){
if (check(i, a, b, c, d) == 0)
s.push_back(i);
if (check(n/i, a, b, c, d) == 0)
s.push_back(n/i);
if (check(-1*i, a, b, c, d) == 0)
s.push_back(-1*i);
if (check(-1*n/i, a, b, c, d) == 0)
s.push_back(-1*n/i);
}
}
}
int main(){
ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0);
ll a, b, c, d;
cin >> a >> b >> c >> d;
if (a == 0 and b == 0 and c == 0 and d == 0){
cout << -1;
return 0;
}
if (a != 0 and b!=0 and c==0 and d==0 or a == 0 and b == 0 and c != 0 and d == 0 or a == 0 and b != 0 and c == 0 and d == 0 or a != 0 and b == 0 and c == 0 and d == 0 or a != 0 and b == 0 and c != 0 and d == 0 or a!= 0 and b!=0 and c!=0 and d==0)
s.push_back(0);
if (a == 0 and b != 0 and c != 0 and d == 0 or a != 0 and b == 0 and c != 0 and d == 0 or a!= 0 and b!=0 and c!=0 and d==0)
poisk(c, a, b, c, d);
if (a != 0 and b!=0 and c==0 and d==0)
poisk(b, a, b, c, d);
poisk(d, a, b, c, d);
sort(s.begin(), s.end());
s.erase((unique(s.begin(), s.end())), s.end());
cout << s.size();
for (ll i = 0; i < s.size(); i++)
cout << " " << s[i];
return 0;
}