#include <bits/stdc++.h>
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>
//#pragma GCC target ("avx2")
//#pragma GCC optimize ("O3")
//#pragma GCC optimize ("unroll-loops")
//#pragma comment (linker, "/STACK: 16777216")
#define f first
#define s second
#define all(x) (x).begin(), (x).end()
#define rall(x) (x).rbegin(), (x).rend()
#define sz(x) ((int)(x).size())
#define pb push_back
#define mp make_pair
#define int long long
using namespace std;
using namespace __gnu_pbds;
template <typename T> inline bool umax(T &a, const T &b) { if(a < b) { a = b; return 1; } return 0; }
template <typename T> inline bool umin(T &a, const T &b) { if(a > b) { a = b; return 1; } return 0; }
typedef long long ll;
typedef long double ld;
typedef unsigned long long ull;
template <typename T> using oset = tree<T, null_type, less <T>, rb_tree_tag, tree_order_statistics_node_update>;
ll mod = 998244353;
const ll base = 1e6 + 5;
const ll inf = 1e18;
const int MAX = 3e3;
const int lg = 20;
random_device rd;
mt19937 gen(rd());
uniform_int_distribution<ll> dis(1, inf);
void add(int &a, int b) {
a += b;
if(a >= mod) a -= mod;
if(a < 0) a += mod;
}
int C[MAX][MAX];
void solve() {
int n, m, k, t;
cin >> n >> m >> k >> t >> mod;
for(int i = 0; i < MAX; i++) {
C[i][0] = C[i][i] = 1;
for(int j = 1; j < i; j++) {
C[i][j] = (C[i - 1][j] + C[i - 1][j - 1]) % mod;
}
}
vector<pair<int, int>> a(k);
for(auto &[x, y] : a) {
cin >> x >> y;
}
sort(all(a));
int ans = 0;
vector<int> ways((1 << k));
for(int mask = 0; mask < (1 << k); mask++) {
vector<pair<int, int>> need = {{0, 0}};
for(int i = 0; i < k; i++) {
if(mask >> i & 1) {
need.pb(a[i]);
}
}
need.pb({n, m});
int sz = sz(need);
int add = 1;
for(int i = 1; i < sz; i++) {
if(need[i - 1].s > need[i].s) {
add = 0;
break;
}
int x = need[i].f - need[i - 1].f, y = need[i].s - need[i - 1].s;
add = (add * C[x + y][y]) % mod;
}
ways[mask] = add;
}
for(int i = 0; i < k; i++) {
for(int mask = 0; mask < (1 << k); mask++) {
if(mask >> i & 1) continue;
int sign = (__builtin_popcount(mask) & 1? -1 : 1);
add(ways[mask], sign * ways[mask | (1 << i)]);
}
}
for(int mask = 0; mask < (1 << k); mask++) {
if(__builtin_popcount(mask) > t) continue;
int sign = (__builtin_popcount(mask) & 1? -1 : 1);
add(ans, sign * ways[mask]);
}
cout << ans << '\n';
}
signed main() {
// freopen("kthpath.in", "r", stdin); freopen("kthpath.out", "w", stdout);
ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0);
int ttt = 1;
// cin >> ttt;
while(ttt--) {
solve();
}
return 0;
}
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
37 ms |
46416 KB |
Output is correct |
2 |
Incorrect |
38 ms |
46412 KB |
Output isn't correct |
3 |
Incorrect |
37 ms |
46448 KB |
Output isn't correct |
4 |
Incorrect |
44 ms |
46768 KB |
Output isn't correct |
5 |
Incorrect |
295 ms |
54604 KB |
Output isn't correct |
6 |
Incorrect |
45 ms |
46540 KB |
Output isn't correct |
7 |
Incorrect |
52 ms |
47008 KB |
Output isn't correct |
8 |
Incorrect |
37 ms |
46396 KB |
Output isn't correct |
9 |
Runtime error |
94 ms |
98264 KB |
Execution killed with signal 11 |
10 |
Runtime error |
97 ms |
102472 KB |
Execution killed with signal 11 |
11 |
Runtime error |
98 ms |
95204 KB |
Execution killed with signal 11 |
12 |
Runtime error |
102 ms |
102436 KB |
Execution killed with signal 11 |
13 |
Runtime error |
93 ms |
94160 KB |
Execution killed with signal 11 |
14 |
Runtime error |
112 ms |
96172 KB |
Execution killed with signal 11 |
15 |
Runtime error |
101 ms |
110696 KB |
Execution killed with signal 11 |
16 |
Runtime error |
106 ms |
110796 KB |
Execution killed with signal 11 |
17 |
Runtime error |
102 ms |
98280 KB |
Execution killed with signal 11 |
18 |
Runtime error |
104 ms |
110680 KB |
Execution killed with signal 11 |
19 |
Runtime error |
107 ms |
110792 KB |
Execution killed with signal 11 |
20 |
Runtime error |
106 ms |
110724 KB |
Execution killed with signal 11 |