LINUX.ORG.RU

помогите разобраться с исходником (pascal)


0

0

Помогите понять что делает эта программа и на каком принципе она основана:
{$I-,S-,Q-,R-}
Program m_inverse;
var
  i: LongInt;
  N: LongInt;
  Result: Int64;
  P, Pos, S: Array[1..100000] of LongInt;
  RCnt, LCnt: Array[1..100000] of Int64;

Function Prev(X: LongInt): LongInt;
begin
  Prev:= X and (X-1);
end;

Function Next(X: LongInt): LongInt;
begin
  Next:= X shl 1 - Prev(X);
end;

Procedure Add(pos: LongInt);
var
  X: LongInt;

begin
  X:= pos;
  While X <= N do begin
    Inc(S[X]);
    X:= Next(X);
  end;
end;

Function FindSimpleSum(x: LongInt): LongInt;
var
  Sum: LongInt;

begin
  Sum:= 0;
  While x>0 do begin
    Sum:= Sum + S[x];
    x:= Prev(x);
  end;
  FindSimpleSum:= Sum;
end;

Function FindSum(l, r: LongInt): LongInt;
begin
  FindSum:= FindSimpleSum(r) - FindSimpleSum(l-1);
end;

begin
  Assign(Input, 'input.txt');
  ReSet(Input);
  ReadLn(N);
  For i:= 1 to N do begin
    ReadLn(P[i]);
    Pos[P[i]]:= i;
  end;
  Close(Input);
  FillChar(S, SizeOf(S), 0);
  For i:= 1 to N do begin
    RCnt[Pos[i]]:= FindSum(Pos[i]+1, N);
    Add(Pos[i]);
  end;
  FillChar(S, SizeOf(S), 0);
  For i:= N downto 1 do begin
    LCnt[Pos[i]]:= FindSum(1, Pos[i]-1);
    Add(Pos[i]);
  end;
  Result:= 0;
  For i:= 1 to N do
    Result:= Result + LCnt[i] * RCnt[i];
  Assign(Output, 'output.txt');
  ReWrite(Output);
  WriteLn(Result);
  Close(Output);
end.


anonymous

Прочитал быстро, на первый взгляд кажется, что "как-то" происходит обработка простых чисел,как - надо запустить и узнать :)

anonymous
()
Ответ на: комментарий от anonymous

такаяже хня, хотя писал диплом на дельфи - ненавижу его дикой и страшной ненавистью, хотя дельфи как сдержа отладки офигенная вещь.

vilfred ☆☆
()

да блин переписать на C это не проблема, проблема - понять как это работает :)

ps: прога ищет в массиве количество троек A[i] > A[j] > A[k] если i < j < k.

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.