CF 294C(Java大数做计数)

时间:2023-03-09 03:34:34
CF 294C(Java大数做计数)

题目链接:http://codeforces.com/contest/294/problem/C

代码:

import java.util.*;
import java.math.*; public class Main {
public static void main(String[] args){
Scanner cin = new Scanner(System.in);
BigInteger[] fir;
fir = new BigInteger[1050];
fir[0] = fir[0].ONE;
for(int i=1; i<=1000; i++)
fir[i] = fir[i-1].multiply(BigInteger.valueOf(i));
BigInteger[] sec;
sec = new BigInteger[1050];
sec[0] = sec[0].ONE;
for(int i=1; i<=1000; i++)
sec[i] = sec[i-1].multiply(BigInteger.valueOf(2)); int n,m;
boolean flag[];
flag = new boolean[1050];
for(int i=0; i<=1000; i++)
flag[i] = false; n = cin.nextInt();
m = cin.nextInt(); int last = 0;
int sta[];
sta = new int[1050];
int cnt = 0; for(int i=1; i<=m; i++)
{
int temp;
temp = cin.nextInt();
flag[temp] = true;
} for(int i=1; i<=n; i++)
{
if(flag[i])
{
if(i-1-last > 0)
{
sta[cnt++] = i - 1 - last;
}
last = i;
}
if(i == n && flag[i] == false)
{
if(i-last > 0)
{
sta[cnt++] = i- last;
}
}
}
BigInteger ans;
ans = fir[n-m]; for(int i=0; i<cnt; i++)
{
int k = sta[i];
ans = ans.divide(fir[k]);
if((i == 0 && !flag[1])||(i == cnt-1 && !flag[n]))
continue; ans = ans.multiply(sec[k-1]);
} ans = ans.mod(BigInteger.valueOf(1000000007));
System.out.println(ans);
}
}