JZOJ 4786 【NOIP2016提高A组模拟9.17】小a的强迫症

时间:2021-04-08 19:09:41

小a的强迫症

题目大意

n 种颜色的珠子,第i种颜色的珠子有 numi 个,要求排列中第 i 种珠子的最后一颗一定要在第 i +1种珠子的最后一颗的前面,求排列珠子的方案。(答案 mod 998244353

数据范围

JZOJ 4786 【NOIP2016提高A组模拟9.17】小a的强迫症

题解

假设当前排列到了第 i 种珠子, 1 ~ i -1种珠子已经排列完了,且方案数为 Wi ,当前放了 K 颗珠子,现在我们考虑放入第 i 种珠子。
我们先拿一颗第 i 种珠子出来,把剩下的 numi - 1 颗珠子放入原序列中。第 1 颗有( K + 1 )个位置可放,第 2 颗有( K + 2 )个位置可放……一直放到第( numi -1)颗珠子有( K + numi - 1 )个位置可放,最后再把开头拿出来的那颗珠子放到最后面便可以满足题目给出的条件,由于是组合,所以还要把方案数除以( numi - 1 )!,即 Wi = Wi1 * Cnumi1K+numi1

由于 998244353 是一个质数, 除法打一个逆元处理就可以了。答案为 Wn

Code(Pascal)

    mo=998244353;
var
ny,num,jc:array[0..560000] of int64;
lj,ans,o,p,lyhsb,n,ma:int64;
i:longint;
function max(a,b:longint):longint;
begin
if a>b then exit(a)
else exit(b);
end;
function ksm(o,cqy:int64):int64;
begin
ksm:=1;
while cqy>0 do
begin
if cqy mod 2=1 then ksm:=ksm*o mod mo;
o:=(o*o) mod mo;
cqy:=cqy div 2;
end;
end;
begin
readln(n);
for i:=1 to n do
begin
read(num[i]);
lyhsb:=lyhsb+num[i];
end;
jc[0]:=1;
ny[0]:=1;
o:=1;
for i:=1 to lyhsb do
begin
o:=o*i mod mo;
jc[i]:=o;
ny[i]:=ksm(o,mo-2);
end;
o:=num[1];
ans:=1;
for i:=2 to n do
begin
ans:=ans*jc[o+num[i]-1] mod mo;
ans:=ans*ny[o] mod mo;
ans:=ans*ny[num[i]-1] mod mo;
o:=o+num[i];
end;
writeln(ans);
end.