제출 #1231058

#제출 시각아이디문제언어결과실행 시간메모리
1231058g4yuhgBinaria (CCO23_day1problem1)C++20
14 / 25
48 ms23880 KiB
//Huyduocdithitp
#include <bits/stdc++.h>
typedef long long ll;
#define endl '\n'
#define yes cout<<"YES"<<endl;
#define no cout<<"NO"<<endl;
#define fi first
#define se second
#define pii pair<ll, ll>
#define inf 1e18
#define faster ios_base::sync_with_stdio(false);cin.tie(NULL);cout.tie(NULL);
#define MP make_pair
#define TASK "ghuy4g"
#define start if(fopen(TASK".inp","r")){freopen(TASK".inp","r",stdin);freopen(TASK".out","w",stdout);}
#define LOG 19
#define N 1000006
using namespace std;

bool ghuy4g; 

ll par[N];

ll getRoot(ll u) {
    if (par[u] < 0) return u;
    par[u] = getRoot(par[u]);
    return par[u];
}

void join(ll u, ll v) {
    u = getRoot(u);
    v = getRoot(v);
    if (u == v) return;
    if (par[u] < par[v]) {
        par[u] += par[v];
        par[v] = u;
    }
    else {
        par[v] += par[u];
        par[u] = v;
    }
}

ll n, k;
ll b[N], a[N];

const ll mod = 1e9 + 7;

ll POW(ll a, ll b, ll mod) {
    if (b == 0) return 1;
    ll t = POW(a, b / 2, mod);
    t = t * t % mod;
    if (b % 2 == 1) {
        t = t * a % mod;
    }
    return t;
}

ll C(ll n, ll k){
    if (k<0 || k>n) return 0;
    // lợi dụng C(n,k)=C(n,n-k)
    if (k > n-k) k = n-k;

    // Tính num = (n-k+1)*(n-k+2)*...*n mod p
    ll num = 1;
    for(ll i = 1; i <= k; i++){
        num = num * ((n - k + i) % mod) % mod;
    }
    // Tính den = k! mod p
    ll den = 1;
    for(ll i = 1; i <= k; i++){
        den = den * i % mod;
    }
    // invert den
    ll inv_den = POW(den, mod-2, mod);  // log(mod) time

    return num * inv_den % mod;
}



bool klinh;

signed main(void) {
	memset(par, -1, sizeof(par));
	memset(a, -1, sizeof(a));
    faster;
	cin >> n >> k;
	for (int i = 1; i <= n - k + 1; i ++) {
		cin >> b[i];
	}
	for (int i = 1; i < n - k + 1; i ++) {
		if (b[i] == b[i + 1]) {
			join(i, i + k);
		}
		else if (b[i] == b[i + 1] + 1) {
			if (a[i] != -1 && a[i] == 0) {
				cout << 0;
				return 0;
			}
			a[i] = 1;
			if (a[i + k] != -1 && a[i + k] == 1) {
				cout << 0;
				return 0;
			}
			a[i + k] = 0;
		}
		else if (b[i] + 1 == b[i + 1]) {
			if (a[i] != -1 && a[i] == 1) {
				cout << 0;
				return 0;
			}
			a[i] = 0;
			if (a[i + k] != -1 && a[i + k] == 0) {
				cout << 0;
				return 0;
			}
			a[i + k] = 1;
		}
	}
	for (int i = 1; i <= n; i ++) {
		if (a[i] == -1) continue;
		ll root = getRoot(i);
		if (a[root] != -1 && a[root] != a[i]) {
			cout << 0;
			return 0;
		}
		a[getRoot(i)] = a[i];
	}
	map<ll, ll> mp;
	ll sum = 0, cnt = 0;
	for (int i = 1; i <= k; i ++) {
		ll r = getRoot(i);
		if (a[r] == 1) sum += 1;
		else if (a[r] == 0) sum += 0;
		else {
			//cout << i << " root " << r << " " << a[r] << endl;
			mp[r] ++ ;
			if (mp[r] > 1) {
				cout << "ngu";
				return 0;
			}
			cnt ++ ;
		}
	}
	ll left = b[1] - sum;
	//cout << cnt << " " << left << endl;
	cout << C(cnt, left);
	
    cerr << fabs(&klinh - &ghuy4g) / 1048576.0;
    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...