import java.util.Scanner;
public class Main {
static final int M = 1000000007;
static final int N = 1000000;
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int[] a = new int[10];
long sum = 0;
long fac = 1;
long[] fact = new long[N + 1];
fact[0] = 1;
for (int i = 1; i < N + 1; ++i) {
fact[i] = (i * fact[i - 1]) % M;
}
for (int i = 0; i <= 9; ++i) {
a[i] = in.nextInt();
sum = (sum + a[i]) % M;
fac = (fac * fact[a[i]]) % M;
}
long sumf = 1;
if (sum > N) {
sumf = fact[N];
for (int i = N+1; i <= sum; ++i) {
sumf = (sumf * i) % M;
}
} else {
sumf = fact[(int)sum];
}
long fac_inv = pow(fac, M - 2) % M;
long ans = (sumf * fac_inv) % M;
System.out.println(ans);
}
static long pow(long n, int m) {
long res = 1;
while (m > 0) {
if ((m & 1) == 1) {
res = (res * n) % M;
}
n = (n * n) % M;
m >>= 1;
}
return res % M;
}
}
调了好久最后才发现是阶乘写错了。
这题我一开始是想不出来的,看了题解之后才做出来的。主要用到了费马小定理求逆元(里面有快速幂),然后就是计算期望的值,化为排列的值。还是用了多重集的排列公式。不错。今天很晚了,就先到这吧

京公网安备 11010502036488号