ex.dpr
来自「tongji acm-online judge solution」· DPR 代码 · 共 100 行
DPR
100 行
{
错排
f(n)=(n-1)*(f(n-1)+f(n-2))
=n!*sum{(-1)^i/i!|0<=i<=n}
}
program Ural_1366(Input,Output);
const
MaxLen=3000;
type
TIndex=Longint;
THP=record
Len:TIndex;
D:array[1..MaxLen]of SmallInt;
end;
var
N:TIndex;
procedure AddHP(var A:THP;const B:THP);
var
i:TIndex;
R:TIndex;
begin
R:=A.D[1]+B.D[1];
i:=1;
while (R>0) or (i<=B.Len) do
begin
A.D[i]:=R mod 10;
Inc(i);
R:=R div 10+A.D[i]+B.D[i];
end;
if i-1>A.Len then A.Len:=i-1;
end;
procedure MinusHP(var A:THP;const B:THP);
var
i:TIndex;
R:TIndex;
begin
R:=A.D[1]-B.D[1];
i:=1;
while (R<>0) or (i<=B.Len) do
begin
if R<0 then
begin
Dec(A.D[i+1]);
Inc(R,10);
end;
A.D[i]:=R mod 10;
Inc(i);
R:=R div 10+A.D[i]-B.D[i];
end;
while (A.D[A.Len]=0) and (A.Len>1) do Dec(A.Len);
end;
procedure MultiplyHP(var A:THP;const B:TIndex); //B>0
var
i:TIndex;
R:TIndex;
begin
R:=A.D[1]*B;
i:=1;
while (R>0) or (i<=A.Len) do
begin
A.D[i]:=R mod 10;
Inc(i);
R:=R div 10+A.D[i]*B;
end;
if i-1>A.Len then A.Len:=i-1;
end;
procedure SetHP(var A:THP;const B:TIndex);
begin
FillChar(A,SizeOf(A),0);
A.Len:=1;
A.D[1]:=B;
end;
procedure Main;
var
i:TIndex;
Tmp,Base,Buffer,Answer:THP;
begin
Readln(N);
SetHP(Base,1);
SetHP(Buffer,0);
SetHP(Answer,0);
for i:=N downto 0 do
begin
if Odd(i) then Buffer:=Base
else
begin
Tmp:=Base;
MinusHP(Base,Buffer);
AddHP(Answer,Base);
Base:=Tmp;
end;
MultiplyHP(Base,i);
end;
for i:=Answer.Len downto 1 do
Write(Answer.D[i]);
Writeln;
end;
begin
Main;
end.
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?