Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 22.01.2012, 13:04   #1
LeonarDaaaaa
 
Регистрация: 22.01.2012
Сообщений: 3
По умолчанию Задача на деревья

Я школьник 11 класса, задача для домашний работы.
Вообщем сама задача :


Используя структуру данных бинарное дерево поиска решить следующую задачу
Известно, что последовательность чисел A вычисляется по следующему закону:
Ai = seedi mod 2000000,
где seedi для i > 1 вычисляется как:
seedi = (seedi-1 * multiplier + addend) mod divisor

Джо, действует по следующему принципу:
Из последовательности A он выписывает N чисел
Вычёркивает из них все повторяющиеся
Сортирует получившуюся последовательность по убыванию
Вычисляет сумму каждых M чисел по модулю D и выписывает эти суммы на доску (естественно что последняя сумма может содержать в себе менее чем M слагаемых).

Ваша задача вычислить, что будет выписано на доске в конечном итоге

Формат входного файла
В первой строке входного файла через пробел даны целые числа: N, M, D, seed1, multiplier, addend, divisor

Формат выходного файла
Выходной файл должен содержать одну строку: то что выписано на доске (числа в строке разделять ровно одним пробелом)

Пример

test.in test.out
6 2 100000 1 2 0 5 7 3

Ограничения
0 < N < 400001
0 < M < 5001
1 < D < 231
1 < divisor < 231
1 < addend < 231
1 < seed1 < 231

Примечания
Для проведения вычислений по вышеуказанным формулам требуется использовать 64-битные целые числа (тип Int64 в языке Pascal и unsigned long long в языке C/C++)
Фразу "A по модулю N" следует читать как, остаток от деления A на N
Полезное свойство модуля: (A + B) mod D = ((A mod D) + (B mod D)) mod D
Поясним на примере вычёркивание повторяющихся элементов из последовательности:
1 2 3 4 4 3 -> 1 2 3 4
LeonarDaaaaa вне форума Ответить с цитированием
Старый 22.01.2012, 15:23   #2
LeonarDaaaaa
 
Регистрация: 22.01.2012
Сообщений: 3
По умолчанию

Хелпаните плз =)
LeonarDaaaaa вне форума Ответить с цитированием
Старый 23.01.2012, 12:13   #3
LeonarDaaaaa
 
Регистрация: 22.01.2012
Сообщений: 3
По умолчанию

Что на столько всё трудно ?
LeonarDaaaaa вне форума Ответить с цитированием
Старый 23.01.2012, 12:17   #4
arrowsf1
Пользователь
 
Аватар для arrowsf1
 
Регистрация: 22.01.2012
Сообщений: 97
По умолчанию

Большей глупостью у вас ещё не страдали???????????
Модераторам: не баньте, у мя такие полезные советы, они стоющие
arrowsf1 вне форума Ответить с цитированием
Старый 23.01.2012, 12:18   #5
arrowsf1
Пользователь
 
Аватар для arrowsf1
 
Регистрация: 22.01.2012
Сообщений: 97
По умолчанию

Тут сбится легко
сказка детская300 рублей
Модераторам: не баньте, у мя такие полезные советы, они стоющие
arrowsf1 вне форума Ответить с цитированием
Старый 30.01.2012, 10:26   #6
Yuht
Новичок
Джуниор
 
Регистрация: 30.01.2012
Сообщений: 1
По умолчанию

Код:
program Project2;

{$APPTYPE CONSOLE}

uses
  SysUtils;

type
  MA = array [1 .. 1000] of Int64;
  JoeTree = ^TNode;

  TNode = record
    Value: Int64;
    Left: JoeTree;
    Right: JoeTree;
  end;

var
  N, M, D, Multiplier, Addend, Divisor, S_end: Int64;
  Seed: array [1 .. 400000] of Int64;
  Fin, Fout: TextFile;
  i, H: Integer;
  JT: JoeTree;
  MT: MA;


procedure Tree(var T: JoeTree; X: Int64);

  function CreateNode(N: Int64): JoeTree;
  var
    p: JoeTree;
  begin
    New(p);
    p^.Value := N;
    p^.Left := nil;
    p^.Right := nil;
    CreateNode := p;
  end;

begin
  if T = nil Then
    T := CreateNode(X)
  else
    with T^ do
    begin
      if Value < X then
        Tree(Right, X)
      else if Value > X Then
        Tree(Left, X);
    end;
end;


procedure ReadTree(var MT: MA; T: JoeTree; var i: Integer);
begin
  if T <> nil then
  begin
    ReadTree(MT, T^.Right, i);
    MT[i] := T^.Value;
    i := i + 1;
    ReadTree(MT, T^.Left, i);
  end;
end;

procedure Summator(H: Integer; M: Int64; MT: MA; Gi: Integer; D: Int64);
 var
  j, k: Integer;
  Summ: array[1..100] of Int64;
  S, Result: Int64;
 begin
  for j:= H to M do
  Summ[j]:= MT[j];
  s:= 0;
  for k:= 1 to M do
  S:= S + Summ[k];
  Result:= S mod D;
  Write(Fout, Result, ' ');
  H:= H + M;
  if H < Gi-1 then
  Summator(H-1, M, MT, Gi, D);
 end;

Procedure TerminateTree(JT:JoeTree);
Begin
 If JT = nil Then
 Exit;

 {Delete(JT^.Right);
 Delete(JT^.Left); }
 Dispose(JT);
End;

var
  Gi: Integer;
begin
  AssignFile(Fin, 'test.in');
  Reset(Fin);
  Read(Fin, N, M, D, Seed[1], Multiplier, Addend, Divisor);
  Close(Fin);
  JT := nil;

  for i := 2 to N do
  begin
    Seed[i] := (Seed[i - 1] * Multiplier + Addend) mod Divisor;
    N := Seed[i] mod 2000000;
    Tree(JT, N);
  end;

  Gi := 1;
  ReadTree(MT, JT, Gi);

  Assign(Fout, 'Test.out');
  Rewrite(Fout);

  H:= 1;
  Summator(H, M, MT, Gi, D);
  if (Gi - 1) mod M > 0 then
  if MT[Gi - 1] > 0 then
  begin
   S_end:= MT[Gi-1] mod D;
   write(Fout, S_end);
  end;
  TerminateTree(JT);
  Close(Fout);
 end.
Возможно потребуется присвоение первого значения корню, до запуска процедуры. Но хотя работает и так))))
Yuht вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Задача по теме "Бинарные деревья" Vate Помощь студентам 10 20.05.2011 12:23
С++ Деревья DenSyntax Фриланс 3 24.06.2010 16:50
(С) 2-3 деревья Lawliet32 Помощь студентам 0 05.01.2010 19:41
Задача на деревья(delphi) Казанцев Андрей Помощь студентам 1 14.04.2009 18:29
Задача про деревья. WhyBeNormal Паскаль, Turbo Pascal, PascalABC.NET 0 21.12.2008 23:51