题解 CF2207E2 【N-MEX (Counting Version)】

· · 题解

下面对每个 i 分类讨论:

综上,将每一步的方案数相乘即可。时间复杂度为 O(\sum n)

代码:

#include <stdio.h>

const int mod = 1e9 + 7;
int a[200001];

void solve(){
    int n;
    scanf("%d", &n);
    for (int i = 1; i <= n; i++){
        scanf("%d", &a[i]);
    }
    for (int i = 1; i <= n; i++){
        int need = (a[i] + 1) - (n - i + 1);
        if (need < 0 || need > i){
            printf("0\n");
            return;
        }
    }
    a[0] = n;
    for (int i = 1; i <= n; i++){
        if (a[i] > a[i - 1]){
            printf("0\n");
            return;
        }
    }
    int ans = 1;
    for (int i = 1; i <= n; i++){
        if (a[i] == a[i - 1]){
            ans = 1ll * ans * (a[i] - (n - i)) % mod;
        } else {
            ans = 1ll * ans * i % mod;
        }
    }
    printf("%d\n", ans);
}

int main(){
    int t;
    scanf("%d", &t);
    for (int cas = 1; cas <= t; cas++){
        solve();
    }
    return 0;
}