msc的棋盘
题号:NC20621
时间限制:C/C++/Rust/Pascal 1秒,其他语言2秒
空间限制:C/C++/Rust/Pascal 512 M,其他语言1024 M
64bit IO Format: %lld

题目描述

一天,msc在家里找到了一个n×m的棋盘。

这个棋盘十分奇特,每个格子最多放一个棋子,但是你并不能看见具体的棋子都放在了哪些地方,但是有一个显示屏可以显示每一行每一列有多少棋子。

然而遗憾的是,由于棋盘已经放了很久,现在显示每一行有多少棋子的部分已经坏掉了,所以msc只能知道现在的棋盘上面每一列有多少棋子。

由于msc是一个有着强烈求知欲的女生,所以她希望知道显示屏坏掉的部分有多少种不同的可能的显示情况。

两种显示情况不同,当且仅当存在至少一行在两种情况中显示的数值是不同的。

msc是解决不了这么复杂的问题的,所以她告诉了你n,m以及b[1..m]表示每一列的棋子个数,请你帮她求出可能的方案数,由于答案可能很大,请将答案对1,000,000,007取模后再输出。

输入描述:

第一行两个整数n和m,分别表示棋盘的行数和棋盘的列数。

第二行m个整数b[1..m],第i个数表示棋盘中第i列上的棋子个数。

输出描述:

一行一个整数表示答案。
示例1

输入

复制
4 2
1 3

输出

复制
13

说明

(0,1,1,2),(0,1,2,1),(0,2,1,1),(1,0,1,2),(1,0,2,1),(1,1,0,2),(1,1,2,0),(1,2,0,1),(1,2,1,0),(2,0,1,1),(2,1,0,1),(2,1,1,0),(1,1,1,1)这13种情况都是合法的。
示例2

输入

复制
10 10
3 1 4 1 5 9 2 6 5 3

输出

复制
281268070

备注:

1≤n,m≤50

0≤b[i]≤n