Поиск целых корней кубического уравнения по заданным коэффициентам

Помогите решить (поделится идеей решения) данной задачи, не проходит 16 тест.

Условие

Напишите программу, которая будет искать все целые X, удовлетворяющие уравнению A*X^3 + B*X^2 + C*X + D = 0, где A, B, C, D – заданные целые коэффициенты.

Входные данные

Во входном файле INPUT.TXT записаны четыре целых числа: A, B, C, D. Все числа по модулю не превышают 2×10^9.

Выходные данные

В выходной файл OUTPUT.TXT выведите сначала количество различных корней этого уравнения в целых числах, а затем сами корни в возрастающем порядке. Если уравнение имеет бесконечно много корней, то следует вывести в выходной файл одно число -1 (минус один).

Проверяющая система: acmp.ru

Мой код: 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;
}

Ответы (0 шт):