Вводятся 5 чисел: a, b, c, d и e. Найдите все целые решения уравнения ( ax3 + bx2 + cx +...

0 голосов
323 просмотров

Вводятся 5 чисел: a, b, c, d и e.

Найдите все целые решения уравнения ( ax3 + bx2 + cx + d ) / ( x - e ) = 0 на отрезке [0,1000] и выведите их количество.

Примеры
входные данные
2
4
9
1
5
выходные данные
0


Информатика (65 баллов) | 323 просмотров
Дано ответов: 2
0 голосов
Правильный ответ

//Pascal

const
  LOWER = 0; //Нижняя граница
  UPPER = 1000; //Верхняя граница

var
  a, b, c, d, e, x, cnt: integer;

begin
  read(a, b, c, d, e);
  for x := LOWER to UPPER do
    if (a*x*x*x + b*x*x + c*x + d = 0) and (x <> e) then
      inc(cnt);
  writeln(cnt);
end.

Пример ввода:
3
4
2
0
1

Пример вывода:
1

(13.3k баллов)
0 голосов

//Когда Глеб расстроился
//Pascal ABC.NET 3.1 сборка 1256

Var
 a,b,c,d,e:real;
 
procedure cube(a,b,c,d,e:real);
Var
 p,q,delta,phi,i:real;
 y:array[1..3] of real;
begin
p:=(3*a*c-sqr(b))/(3*sqr(a));
q:=(2*power(b,3)-9*a*b*c+27*sqr(a)*d)/(27*power(a,3));
delta:=power(q/2,2)+power(p/3,3);
if delta<0 then<br> begin
  if q<0 then<br>   phi:=arctan(sqrt(-delta)/(-q/2));
  if q>0 then
   phi:=arctan(sqrt(-delta)/(-q/2))+pi;
  if q=0 then
   phi:=pi/2;
  y[1]:=2*sqrt(-p/3)*cos(phi/3);
  y[2]:=2*sqrt(-p/3)*cos(phi/3+(2*pi)/3);
  y[3]:=2*sqrt(-p/3)*cos(phi/3+(4*pi)/3);
  var x:=seq(y[1]-b/(3*a),y[2]-b/(3*a),y[3]-b/(3*a));
  write(x.where(x -> x<>e).where(x -> frac(x)=0).where(x -> x>=0).Where(x -> x<=1000).Distinct.Count);<br> end;
if delta>0 then
 begin
  var arsom:=range(0,1000).Where(x->(a*power(x,3)+b*x*x+c*x+d)/(x-e)=0);
  write(arsom.Count);
  {Мы не виноваты, Паскаль не может в комплексные числа}
 end;
if delta=0 then
 begin
  y[1]:=2*power(-q/2,1/3);
  y[2]:=-power(-q/2,1/3);
  var x:=seq(y[1]-b/(3*a),y[2]-b/(3*a));
  write(x.where(x -> x<>e).where(x -> frac(x)=0).where(x -> x>=0).Where(x -> x<=1000).Distinct.Count);<br> end;
end;

procedure square(a,b,c,e:real);
Var
 d:real;
begin
d:=sqr(b)-4*a*c;
if d<0 then writeln('0');<br>if d>0 then
 begin
  var x:=arr((-b+sqrt(d))/(2*a),(-b-sqrt(d))/(2*a));
  write(x.where(x -> x<>e).where(x -> frac(x)=0).where(x -> x>=0).Where(x -> x<=1000).Distinct.Count);<br> end;
if d=0 then
 begin
  var x:=arr(-b/(2*a));
  write(x.where(x -> x<>e).where(x -> frac(x)=0).where(x -> x>=0).Where(x -> x<=1000).Distinct.Count);<br> end;
end;

procedure common(a,b,e:real);
begin
 var x:=arr(-b/a);
 write(x.where(x -> x<>e).where(x -> frac(x)=0).where(x -> x>=0).Where(x -> x<=1000).Distinct.Count);<br>end;

procedure awfulvar(e:real);
begin
 if (e>=0) and (e<=1000) then writeln('1000') else writeln('1001');<br>end;

procedure otherawfulvar(e:real);
begin
 if e<>0 then writeln('1') else writeln('0');
end;

begin
read(a,b,c,d,e);
if (a<>0) and (b<>0) then cube(a,b,c,d,e);
if (a=0) and (b<>0) then square(b,c,d,e);
if (a=0) and (b=0) and (c<>0) and (d<>0) then common(c,d,e);
if (a=0) and (b=0) and (c=0) and (d=0) then awfulvar(e);
if (a=0) and (b=0) and (c<>0) and (d=0) then otherawfulvar(e);
if (a=0) and (b=0) and (c=0) and (d<>0) then writeln('0');
end.

Пример ввода:
1
1
1
1
1
Пример вывода:
0

(38.6k баллов)
0

Я думаю, что самое правильное - сделать прикидку насчет действительных корней, и если их больше одного, найти один x1, а затем разделив кубический полином на (x-x1) понизить степень до второй... а там вообще не проблема по дискриминанту.

0

Не думал, что так далеко зайдет. Как я понял, вариант выше — решение задачи для вещественных корней?

0

Для целых корней, попадающих в диапазон integer, можно использовать теорему Безу, перебирая делители свободного коэффициента.

0

Можно.

0

Но хохма-то в том, что сами корни не нужны, поскольку в вопросе сказано о выводе только их количества))

0

И опять вернемся к перебору...

0

Продолжение поразительных историй про перебор. Собираюсь я уже выложить дополненную версию кода выше, как вдруг меня дёргает проверить на примере A1dar. Выводит 0. Начал копаться. Помните ту строку про комплексные числа? Так вот, она туда и попадает, в итоге возвращая NaN. Теперь вопрос дня - где в Паскале мнимая единица?

0

В Паскале нет мнимой единицы. Но PascalABC.NET умеет напрямую работать с переменными типа Сomplex. Наберите в нем нечто вида var a:Complex; и далее a. - и по точке получите все необходимые подсказы. Создавать "на лету" комплексные числа можно при помощи вызова Cplx(re,im)

0

И тогда мнимая единица может быть, к примеру такой: var im1:=Cplx(0,-1);

0

Если Вам снова захочется внести исправление, Вы скопируйте себе то, что уже есть в ответе и сообщите - я просто удалю этот ответ и Вы напишете новый. Ибо комментариев тут уже вагон....