题意:给你三只行走方式,求不经过给定点的行走路径数,
思路:经典套路dp,因为总步数不超过300,并且只有三种行走方式所以直接三维dp表示走了i步其中j步第一种,k步第二种。
/*keep on going and never give up*/
#include<cstdio>
#include<set>
#include<iostream>
#include<queue>
#include<algorithm>
using namespace std;
typedef pair<int, int> pii;
#define int long long
#define lowbit(x) x&(-x)
#define endl '\n'
#define wk is zqx ta die
const int mod = 998244353;
set<pii> st;
int dp[305][305][305];
signed main() {
std::ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
int n, m;
cin >> n >> m;
int a, b, c, d, e, f;
cin >> a >> b >> c >> d >> e >> f;
for (int i = 1; i <= m; i++) {
int x, y;
cin >> x >> y;
st.insert({x, y});
}
dp[0][0][0] = 1;
for (int i = 1; i <= n; i++) {
for (int j = 0; j <= i; j++) {
for (int k = 0; k + j <= i; k++) {
int p = i - j - k;
if (st.count( {j * a + k * c + p * e, j * b + k * d + f * p})) {
continue;
}
if (p) {
dp[i][j][k] = (dp[i][j][k] + dp[i - 1][j][k]) % mod;
}
if (j) {
dp[i][j][k] = (dp[i][j][k] + dp[i - 1][j - 1][k]) % mod;
}
if (k) {
dp[i][j][k] = (dp[i][j][k] + dp[i - 1][j][k - 1]) % mod;
}
}
}
}
int ans = 0;
for (int i = 0; i <= n; i++) {
for (int j = 0; j + i <= n; j++) {
ans = (ans + dp[n][i][j]) % mod;
}
}
cout << ans << endl;
return 0;
}