比赛 csp2025模拟练习3 评测结果 AAAAAAAAAAAAAAAAAAAAAAAAA
题目名称 Binaria 最终得分 100
用户昵称 wdsjl 运行时间 1.819 s
代码语言 C++ 内存使用 26.27 MiB
提交时间 2025-10-30 11:34:21
显示代码纯文本
#include <bits/stdc++.h>
#define int long long
using namespace std;

const int MOD = 1000003;
const int MAXN = 1e6;

int f[MAXN + 1];
int i_f[MAXN + 1];

int qp(int a, int b, int mod) {
    int res = 1;
    while(b>0){
        if(b&1){
            res=res*a%mod;
        }
        a=a*a%mod;
        b>>=1;
    }
    return res;
}

void init() {
    f[0]=1;
    for (int i=1; i<=MAXN;++i) {
        f[i]=f[i-1]*i%MOD;
    }
    i_f[MAXN]=qp(f[MAXN],MOD-2,MOD);
    for (int i=MAXN-1;i>=0;--i) {
        i_f[i]=i_f[i+1]*(i+1)%MOD;
    }
}

signed main() {
    freopen("Binaria.in","r",stdin);
    freopen("Binaria.out","w",stdout);
    init();
    int N, K;
    scanf("%lld%lld",&N,&K);
    int M=N-K+1;
    vector<int> s(M);
    for (int i=0;i<M;++i) {
        scanf("%lld",&s[i]);
    }
    vector<int> d;
    if(M>1){
        d.resize(M-1);
        for (int i=0;i<M-1;++i) {
            d[i]=s[i+1]-s[i];
        }
    }
    int L=d.size();
    vector<int> fixed(K, -1);
    bool iok = true;
    for (int j = 0; j < K; ++j) {
        int ps = j;
        int sum_d = 0;
        while (ps < L) {
            sum_d += d[ps];
            if (sum_d == 1) {
                if (fixed[j] == -1) {
                    fixed[j] = 0;
                } else if (fixed[j] == 1) {
                    iok = false;
                    break;
                }
            } else if (sum_d == -1) {
                if (fixed[j] == -1) {
                    fixed[j] = 1;
                } else if (fixed[j] == 0) {
                    iok = false;
                    break;
                }
            }
            ps += K;
        }
        if (!iok) break;
    }
    if (!iok) {
        printf("0\n");
        return 0;
    }
    int s_fixed = 0;
    int f_cnt = 0;
    for (int val : fixed) {
        if (val == -1) {
            f_cnt++;
        } else {
            s_fixed += val;
        }
    }
    int r = s[0] - s_fixed;
    if (r < 0 || r > f_cnt) {
        printf("0\n");
    } else {
        int ans = f[f_cnt] * i_f[r] % MOD;
        ans = ans * i_f[f_cnt - r] % MOD;
        printf("%lld\n", ans);
    }
    return 0;
}