bzoj#P4549. [CTSC2016]萨菲克斯.阿瑞

[CTSC2016]萨菲克斯.阿瑞

题目描述

小 P 来到了 NOIP2044 的赛场上,他发现第二题的题目是这样的:给你一个长度为 nn 的字符串,该字符串由至多 mm 种不同的字符组成,其中第 ii 种字符的出现次数不超过 cic_i,问你这个字符串的后缀数组是什么。

聪明的小 P 想到了一个新的问题希望你来帮忙解答:在题目给定的限制下,能有多少种不同的答案。也就是所有由 mm 种字符组成,其中第 ii 种字符出现次数不超过 cic_i,且长度为 nn 的字符串,共有多少种不同的后缀数组。

由于答案很大,你只用输出答案对 109+710^9+7 取模后的数。

对于一个字符串 s=s1s2sns=s_1s_2\cdots s_n,记 suf(i)\operatorname{suf}(i) 表示 ii 这个位置到末尾的子串。后缀数组为一个 11nn 的排列 p1,p2,,pnp_1,p_2,\cdots,p_n,满足 $\operatorname{suf}(p_1) < \operatorname{suf}(p_2) < \cdots < \operatorname{suf}(p_n)$。对于两个字符串 sstt,令 ii 为第一个使得 sitis_i \neq t_i 的位置,那么我们 sis_itit_i 中小的对应的字符串更小,如果 ii 不存在,那么长度小的字符串更小。

对于字符串之间的大小关系,我们规定第 11 个字符最小,第 22 个字符次小,以此类推。

输入格式

输入的第一行包含两个正整数 n,mn,m,表示字符串的长度为 nn,共有 mm 种字符。

接下来一行,包含 mm 个非负整数 c1,c2,,cmc_1,c_2,\cdots,c_m,表示每种字符最多的出现次数。

输出格式

输出共一行,包含一个整数,表示答案。

样例输入 #1

3 2
2 2

样例输出 #1

5

样例说明 #1

我们记 aa 为第一种字符,bb 为第二种字符,那么共有 aab,aba,abb,baa,bab,bbaaab,aba,abb,baa,bab,bba 这六种可能的字符串。它们的后缀数组为

(1,2,3),(3,1,2),(1,3,2),(3,2,1),(2,3,1),(3,2,1)(1,2,3),(3,1,2),(1,3,2),(3,2,1),(2,3,1),(3,2,1)

所以共有 55 种不同的结果。

样例输入 #2

10 5
2 3 4 3 2

样例输出 #2

1003811

数据规模与约定

对于前 5%5\% 的测试点,1n,m61\le n,m\leq6

另有 10%10\% 的测试点,1n,m101\le n,m\leq10

另有 20%20\% 的测试点,1n,m5001\le n,m\leq500。其中有 5%5\% 的测试点 m=2m = 25%5\% 的测试点 m=3m = 310%10\% 的测试点 c1=c2==cm=nc_1=c_2=\cdots=c_m=n

另有 15%15\% 的测试点,1n,m501\le n,m\leq50

另有 20%20\% 的测试点,1n,m2001\le n,m\leq200

另有 30%30\% 的测试点,1n,m5001\le n,m\leq500

数据保证 0c1,c2,,cmn0 \leq c_1,c_2,\cdots,c_m \leq nc1+c2++cmnc_1+c_2+\cdots+c_m \geq n