Submission #1303960

#TimeUsernameProblemLanguageResultExecution timeMemory
1303960activedeltorreBinaria (CCO23_day1problem1)C++20
25 / 25
196 ms24588 KiB
#include <iostream>
#include <algorithm>
#include <vector>
#include <map>


using namespace std;
int v[1000005];
int sef[1000005];
int zero[1000005];
int unu[1000005];
long long fact[1000005];
int find(int i)
{
    if(sef[i]==i)
    {
        return i;
    }
    return sef[i]=find(sef[i]);
}
void merge(int i,int j)
{
    if(i!=j)
    {
        unu[i]+=unu[j];
        zero[i]+=zero[j];
        sef[j]=i;
    }
}
long long mod=1e6+3;
long long lgpow(long long a,long long exp)
{
    long long prod=1;
    while(exp)
    {
        if(exp%2==1)
        {
            prod=(prod*a)%mod;
        }
        a=(a*a)%mod;
        exp=exp/2;
    }
    return prod;
}
signed main()
{
    long long n,i,j,k,l,t,h,w,x,m,a,b;
    cin>>n>>k;
    for(int i=1;i<=n-k+1;i++)
    {
        cin>>v[i];
        zero[i]=0;
        unu[i]=0;
        sef[i]=i;
    }
    int imp=0;
    for(int i=1;i<=n-k;i++)
    {
        if(v[i]==v[i+1])
        {
            merge(i,i+k);
        }
        else if(v[i]==v[i+1]+1)
        {
            unu[find(i)]++;
            zero[find(i+k)]++;
        }
        else if (v[i]==v[i+1]-1)
        {
            zero[find(i)]++;
            unu[find(i+k)]++;
        }
        else
        {
            imp=1;
        }
    }
    int cnt=0,lib=0;
    for(int i=1;i<=k;i++)
    {
        if(zero[i]>=1 && unu[i]>=1)
        {
            imp=1;
        }
        else if(unu[i]>=1)
        {
            cnt++;
        }
        else if(zero[i]==0)
        {
            lib++;
        }
    }
    if(cnt>v[1] || cnt+lib<v[1])
    {
        imp=1;
    }
    if(imp==1)
    {
        cout<<0;
    }
    else
    {
        fact[0]=1;
        for(int i=1;i<=n;i++)
        {
            fact[i]=(fact[i-1]*i)%mod;
        }
        cout<<fact[lib]*lgpow(fact[v[1]-cnt],mod-2)%mod*lgpow(fact[lib-(v[1]-cnt)],mod-2)%mod;
    }
    return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...