用P写的高精度,格式不好仅供参考。。
type
bignum = array [1..50] of longint;
var
d : array[1..100,1..100] of bignum;
i,n,k,p,flag : longint;
ans : bignum;
st,res : string;
operator + (a,b : bignum) c:bignum;
var
i : longint;
begin
for i := 1 to 50 do
c[i] := a[i] + b[i];
for i := 1 to 50 do begin
c[i+1] := c[i+1] + c[i] div 10000;
c[i] := c[i] mod 10000;
end;
end;
operator * (x : longint; a : bignum) c : bignum;
var
i : longint;
begin
for i := 1 to 50 do
c[i] := a[i] * x;
for i := 1 to 50 do begin
c[i+1] := c[i+1] + c[i] div 10000;
c[i] := c[i] mod 10000;
end;
end;
function s(n,k : longint):bignum;
begin
if d[n,k][1] > 0 then exit(d[n,k]);
d[n-1,k] := s(n-1,k);
d[n-1,k-1] := s(n-1,k-1);
s := k*d[n-1,k] + d[n-1,k-1];
end;
begin
readln(k,n);
for i := 1 to n do begin
d[i,i][1] := 1;
d[i,1][1] := 1;
end;
ans := s(n,k-1);
for i := 2 to k-1 do ans := i * ans;
for i := 50 downto 1 do begin
str(ans[i],st);
while length(st) < 4 do st := ’0’ + st;
res := res + st;
end;
while res[1] = ’0’ do delete(res,1,1);
writeln(res);
end.
var n,k,i,j:longint;
f,g:array[1..100] of num;
jc:array[0..100] of num;
ans:num;
function mul(x:num;kk:longint):num;
var ii,ll:longint;
begin
if (kk=0) or (x[0]=0) then begin
fillchar(x,sizeof(x),0);
mul:=x; exit;
end;
ll:=trunc(ln(kk)/ln(10))+1;
for ii:=1 to x[0] do
x[ii]:=x[ii]*kk;
for ii:=1 to x[0]+ll do begin
x[ii+1]:=x[ii+1]+x[ii] div 10;
x[ii]:=x[ii] mod 10;
end;
if x[x[0]+ll]=0 then x[0]:=x[0]+ll-1 else x[0]:=x[0]+ll;
mul:=x;
end;
function add(x1,x2:num):num;
var ii:longint;
begin
if x2[0]>x1[0] then x1[0]:=x2[0];
for ii:=1 to x1[0] do x1[ii]:=x1[ii]+x2[ii];
for ii:=1 to x1[0] do begin
x1[ii+1]:=x1[ii+1]+x1[ii] div 10;
x1[ii]:=x1[ii] mod 10;
end;
if x1[x1[0]+1]>0 then x1[0]:=x1[0]+1;
add:=x1;
end;
function mm(x1,x2:num):num;
var ii,jj:longint;
c:num;
begin
fillchar(c,sizeof(c),0);
for ii:=1 to x1[0] do
for jj:=1 to x2[0] do
c[ii+jj-1]:=c[ii+jj-1]+x1[ii]*x2[jj];
for ii:=1 to x1[0]+x2[0]-1 do begin
c[ii+1]:=c[ii+1]+c[ii] div 10;
c[ii]:=c[ii] mod 10;
end;
if c[x1[0]+x2[0]]>0 then c[0]:=x1[0]+x2[0] else c[0]:=x1[0]+x2[0]-1;
mm:=c;
end;
begin
read(k,n); k:=k-1;
if k>n then begin writeln(0); exit; end;
for i:=1 to n do begin
f[1][1]:=1; f[1][0]:=1; end;
for i:=2 to n do begin
g[1][1]:=1; g[1][0]:=1;
for j:=2 to k do
g[j]:=add(mul(f[j],j),f[j-1]);
f:=g;
end;
jc[1][0]:=1; jc[1][1]:=1; jc[0]:=jc[1];
for i:=2 to 100 do
jc[i]:=mul(jc[i-1],i);
ans:=mm(f[k],jc[k]);
for i:=ans[0] downto 1 do write(ans[i]);
writeln;
end.
n,k是倒着输入的,也就是n k
样例给了个3 3 太放屁了!
(囧)弄倒了居然有40分
PS:LS的高精度写得很奇特