Submission #1323977

#TimeUsernameProblemLanguageResultExecution timeMemory
1323977Jawad_Akbar_JJ힘 센 거북 (IZhO11_turtle)C++20
5 / 100
14 ms12136 KiB
#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;
const int N = 600005, KK = 25;
int fac[N], inv[N], Pre[10][N], P, Num[N];
int dp[KK][KK], dp2[KK][KK], fdp[KK][KK];

vector<pair<int, int>> trp, prms;

int power(int a, int b, int M){
	int ans = 1, pr = a;
	for (; b; b >>= 1){
		if (b & 1)
			ans = ans * pr % M;
		pr = pr * pr % M;
	}
	return ans;
}

int main(){
	int n, m, K, T, Z, Mod, tot;
	cin>>n>>m>>K>>T>>Z, Mod = tot = Z;

	trp = {{0, 0}, {n, m}};
	for (int i=1, x, y;i<=K;i++)
		cin>>x>>y, trp.push_back({x, y});
	sort(begin(trp), end(trp));

	for (int i=2;i*i<=Z;i++){
		int c = 0;
		while (Z % i == 0)
			c++, Z /= i;
		if (c)
			prms.push_back({i, c}), P++, tot = (tot / i) * (i-1);
	}
	if (Z > 1)
		prms.push_back({Z, 1}), P++, tot = (tot / Z) * (Z-1);


	fac[0] = 1;
	for (int i=1;i<N;i++){
		Num[i] = i;
		for (int j=0;j<P;j++){
			Pre[j][i] = Pre[j][i-1];
			while (Num[i] % prms[j].first == 0)
				Num[i] /= prms[j].first, Pre[j][i]++;
		}
		fac[i] = fac[i-1] * Num[i] % Mod;
	}

	inv[N - 1] = power(fac[N - 1], tot - 1, Mod);
	for (int i=N-2;i>=0;i--)
		inv[i] = inv[i+1] * Num[i+1] % Mod;

	for (int i=0;i<K+2;i++){
		for (int j=0;j<K+2;j++){
			int X = trp[j].first - trp[i].first, Y = trp[j].second - trp[i].second;
			if (X < 0 or Y < 0)
				continue;
			dp[i][j] = fac[X + Y] * inv[X] % Mod * inv[Y] % Mod;
			for (int k=0;k<P;k++)
				dp[i][j] = dp[i][j] * power(prms[k].first, Pre[k][X + Y] - Pre[k][X] - Pre[k][Y], Mod) % Mod;
		}
	}
	// cout<<"done"<<endl;
	for (int i=0;i<K+2;i++){
		for (int j=0;j<K+2;j++){
			if (!dp[i][j])
				continue;
			dp2[i][j] = dp[i][j];
			for (int l=i+1;l<j;l++){
				dp2[i][j] = (dp2[i][j] - dp2[i][l] * dp[l][j]) % Mod;
				if (dp2[i][j] < Mod)
					dp2[i][j] += Mod;
			}
			// cout<<i<<" "<<j<<" "<<dp[i][j]<<" "<<dp2[i][j]<<'\n';
		}
	}
	fdp[0][0] = 1;
	for (int i=1;i<K+2;i++){
		for (int j=0;j<i;j++)
			for (int t=0;t<=T;t++)
				fdp[i][t+1] = (fdp[i][t+1] + fdp[j][t] * dp2[j][i]) % Mod;

	}

	int Ans = 0;
	for (int t=0;t<=T+1;t++)
		Ans = (Ans + fdp[K+1][t]) % Mod;
	cout<<Ans<<'\n';
}
#Verdict Execution timeMemoryGrader output
Fetching results...