将题目转化为求组合数,之后用快速幂求组合数即可,代码比较乱 // // Created by // #include <stdio.h> #include <stdlib.h> long long fac[100010]; const int MOD = 1e9 + 7; int N,K; const int MAXN = 1e5 + 10; int X[MAXN]; long long da[MAXN];//G++ long long void init() { int i; da[0]=1; da[1]=1; for(i=2;i<MAXN;i++) da[i]=i*da[i-1]%MOD; } long long quickmod(long long a,long long b) { long long ans=1; while(b) { if(b&1) { ans=(ans*a)%MOD; b--; } b/=2; a=((a%MOD)*(a%MOD))%MOD; } return ans; } long long C(long long a, long long b) { return (da[a]%MOD)*(quickmod(da[b]*da[a-b]%MOD,MOD-2))%MOD; } int main(){ init(); scanf("%d %d",&N,&K); int m = N; int n = 0; int tmp = 0; for(int i = 1 ; i <= (N - K); i ++){ scanf("%d",&X[i]); } // if(N - K == 1){ // printf("1\n"); // return 0; // } for(int j = 2 ; j <= (N - K) ; j ++){ if(X[j] <= X[j-1]){ n++; m -= (X[j-1]); } } n ++; m -= (X[N - K]); if(m < 0){ printf("No\n"); return 0; } long long res = C(m+n-1,n-1); printf("%lld\n",(res%(MOD))); return 0; }