function Main(input) {
  input = input.split("\n");
  const tmp = input[0].split(" ")
  var N = parseInt(tmp[0]);
  var M = parseInt(tmp[1]);
  input.shift();
  
  var a = input.map(v => parseInt(v));
  
  // console.log(countStepComb(N));

  
  /* 壊れている床同士の間隔ごとに組み合わせ数を調べ、掛けていく */
  var all = 1;
  for(var i = 0; i <= M; i++){
    
    var diff = 0;
    
    // i==1のときは0段目との間隔
    if(i==0) {
      diff = a[i] - 1 ;
    }
    // i==Mのときは最上段と比べる
    else if(i==M){
      diff = N - a[i-1];
    }
    else {
      // もし連続していたら到達不可能
      if( (a[1] - a[i-1]) == 1){
        all = 0;
        break;
      }
      diff = (a[i] - a[i-1]) - 1;
    }
	var d = countStepComb(diff);
    console.log(diff);
    console.log(d);
    all *= d;
  }
  console.log(all%1000000007);
}

function countStepComb(steps){
  // 2段飛びが取れる最大の数
  const maxStep2 = Math.floor(steps/2);
  
  console.log(steps,maxStep2);
  
  // 2段飛びする回数で数え上げ
  var sum = 0;
  for (var i = 0; i <= maxStep2; i++){
    // 2段飛びする数
    var step2 = i;
    // 1段飛びする数
    var step1 = steps - step2*2;
    
    // 組み合わせの数は step1+step2 C step2
    sum += factorial(step1+step2)/factorial(step2)/factorial(step1);
  }
  return sum;
}
  
//階乗
function factorial(v) {
 if (v < 2) return 1;
 return v * factorial(v - 1);
}

Main(require("fs").readFileSync("/dev/stdin", "utf8"));
