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

小a的强迫症

题目大意

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

数据范围

这里写图片描述

题解

假设当前排列到了第 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.
  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值