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);
    }
}
View Code

 

 

posted @ 2013-11-01 16:48  等待最好的两个人  阅读(193)  评论(0编辑  收藏  举报