题意:
思路:
考虑dp,题目显然提到2个状态:位置和操作次数,因此设置dp[i][j]表示在i位置第j次操作是否合法。
易得状态转移方程:
dp[(i + a[j]) % n][j] |= dp[i][j - 1];
dp[((i - a[j]) % n + n) % n][j] |= dp[i][j - 1];
code:
#include <bits/stdc++.h>
#include<bits/extc++.h>
using namespace __gnu_pbds;
using namespace std;
using i64 = long long;
using u64 = unsigned long long;
using PII = pair<i64, i64>;
const int inf = 0x3f3f3f3f;
const i64 INF = 0x3f3f3f3f3f3f3f3f;
#define Z cout << "\n"
#define lb lower_bound
#define ub upper_bound
#define D(x) cerr << #x << ": " << (x) << "\n"
#define DV(v) cerr<<#v<<": ";for(int i=0;i<(v).size();i++)cerr<<((v)[i])<<",";cerr<<"\n"
#if 0
#define int i64
#endif
const int N = 5005;
int dp[N][N], a[N];
signed main() {ios::sync_with_stdio(false), cin.tie(nullptr), cout.tie(nullptr);int n, m;cin >> n >> m;for (int i = 1; i <= m; i++)cin >> a[i];dp[0][0] = 1;for (int j = 1; j <= m; j++) {for (int i = 0; i < n; i++) {dp[(i + a[j]) % n][j] |= dp[i][j - 1];dp[((i - a[j]) % n + n) % n][j] |= dp[i][j - 1];}}cout << (dp[0][m] ? "YES" : "NO");return 0;
}