【BZOJ4517】排列计数(排列组合)

题意:1-n的一个序列,其中有m个a[i]=i,求方案数

n,m<=1000000

题意:显然ANS=c(n,m)*d[n-m]

d[i]为错排方案数=d[i-1]*n+(-1)^n

 1 const mo=1000000007;
 2 var fac,exf,d:array[0..1000000]of int64;
 3     cas,i,n,m:longint;
 4 
 5 function c(x,y:longint):int64;
 6 begin
 7  exit(fac[x]*exf[y] mod mo*exf[x-y] mod mo);
 8 end;
 9 
10 begin
11  assign(input,'bzoj4517.in'); reset(input);
12  assign(output,'bzoj4517.out'); rewrite(output);
13  d[1]:=0;
14  for i:=2 to 1000000 do
15  begin
16   d[i]:=d[i-1]*i;
17   if i and 1=0 then inc(d[i])
18    else dec(d[i]);
19   d[i]:=d[i] mod mo;
20  end;
21  fac[0]:=1; exf[0]:=1; exf[1]:=1;
22  for i:=1 to 1000000 do fac[i]:=fac[i-1]*i mod mo;
23  for i:=2 to 1000000 do exf[i]:=exf[mo mod i]*(mo-mo div i) mod mo;
24  for i:=1 to 1000000 do exf[i]:=exf[i-1]*exf[i] mod mo;
25  readln(cas); d[0]:=1;
26  for i:=1 to cas do
27  begin
28   readln(n,m);
29   writeln(c(n,m)*d[n-m] mod mo);
30  end;
31  close(input);
32  close(output);
33 end.
原文地址:https://www.cnblogs.com/myx12345/p/6445398.html