level 1
var
a,lt:array[1..50000] of longint;
i,x,n:longint;
ans:int64;
procedure mcom(s,md,t:longint);
var
l,r,i:longint;
begin
l:=s;
r:=md+1;
for i:=s to t do
begin
if (l<=md) and ((r>t) or (a[l]<=a[r])) then
begin
lt[i]:=a[l];
inc(l);
end
else
begin
lt[i]:=a[r];
inc(r);
x:=x+md-l+1;
end;
end;
for i:=s to t do a[i]:=lt[i];
end;
procedure msort(s,t:longint);
var
md:longint;
begin
if s<>t then
begin
md:=(s+t) shr 1;
msort(s,md);
msort(md+1,t);
mcom(s,md,t);
end;
end;
function pw(k:longint):int64;
begin
if k=0 then exit(1);
pw(k shr 1);
ans:=ans*ans mod 1991;
if odd(k) then ans:=ans*2 mod 1991;
exit(ans);
end;
begin
assign(input,'sequence.in');
assign(output,'sequence.out');
reset(input);
rewrite(output);
readln(n);
x:=0;
fillchar(a,sizeof(a),0);
for i:=1 to n do read(a[i]);
msort(1,n);
ans:=1;
writeln(pw(x));
close(input);
close(output);
end.
2016年08月16日 03点08分
6