HDU 4828 Catalan+逆元法

题意简述
给定一个 2N 的矩阵,把 1 2N 这些数依次放进去,求使每行每列都递增的方案数(对 109+7 取模)。

分析
扯一句——本题来自2014年百度之星程序设计大赛 - 初赛(第一轮),据说也是许多IT公司的面试题。
将在第一行放数视为入栈,将在第二行放数视为出栈,即可保证两个递增条件。
问题转化为求第 n Catalan 数。
Catalan 数入门
逆元法入门


代码实现

const
mo=1000000007;
var
i,n,k,cases,ans,tmp:longint;
fac:array[0..2000000] of int64;

function ni(t:longint):int64;
var
k:longint;
begin
    if t=1 then begin ni:=1;exit;end;
    k:=mo div t+1;
  ni:=k*ni(k*t-mo) mod mo;
end;

begin
  fac[0]:=1;
  for i:=1 to 2000000 do fac[i]:=fac[i-1]*i mod mo;
  readln(cases);
  for i:=1 to cases do
  begin
    readln(n);tmp:=ni(fac[n]);
    ans:=fac[2*n]*tmp mod mo*tmp mod mo*ni(n+1) mod mo;
    writeln('Case #',i,':');
    writeln(ans);
  end;
end.

你可能感兴趣的:(解题报告)