#include<bits/stdc++.h> usingnamespace std; #define ll long long #define debug(x) cout << #x << ":\t" << x << endl; constint N = 2e6 + 10; constint INF = 0x3f3f3f3f; const ll inf = 0x3f3f3f3f3f3f3f3f; const ll mod = 1e9 + 7; int n; int a[N], b[N]; int dp[1010][1010], vis[1010]; intmain(){ scanf("%d", &n); for (int i = 1; i <= n; i++) { int l, r; scanf("%d%d", &l, &r); if (l != -1 && r != -1 && r <= l) { puts("No"); return0; } if (l != -1) { if (vis[l]) { puts("No"); return0; } a[l] = r; vis[l] = 1; } if (r != -1) { if (vis[r]) { puts("No"); return0; } b[r] = l; vis[r] = 1; } } n <<= 1; for (int len = 2; len <= n; len += 2) { for (int i = 1; i <= n - len + 1; i++) { int j = i + len - 1; for (int k = i; k < j; k++) { if (dp[i][k] && dp[k + 1][j]) { dp[i][j] = 1; break; } } if (dp[i][j])continue; dp[i][j] = 1; for (int k = i; k <= i + len / 2 - 1; k++) { if (b[k])dp[i][j] = 0; if (a[k]) { if (a[k] != -1 && a[k] - k != len / 2)dp[i][j] = 0; else { if (b[k + len / 2] && b[k + len / 2] != k)dp[i][j] = 0; } } } for (int k = i + len / 2; k <= j; k++) { if (a[k])dp[i][j] = 0; if (b[k]) { if (b[k] != -1 && k - b[k] != len / 2)dp[i][j] = 0; else { if (a[k - len / 2] && a[k - len / 2] != k)dp[i][j] = 0; } } } } } puts(dp[1][n] ? "Yes" : "No"); return0; }
D - Multiset Mean
题意:给定n,k,1 到 n 每个数可以选 0 到 k 次,对于 1≤x≤n,求凑出集合,集合均值为 x 的方案数。
#include<bits/stdc++.h> #define debug(x) cout << #x << ":\t" << (x) << endl; usingnamespace std; #define ll long long constint N = 2e6 + 10; constint INF = 0x3f3f3f3f; const ll inf = 0x3f3f3f3f3f3f3f3f; int n, K; int m; int dp[110][1000010]; ll ps[110]; intmain(){ scanf("%d%d%d", &n, &K, &m); dp[0][0] = 1; int s = 0; for (int i = 1; i <= n; i++) { fill(ps, ps + i, 0); s += i; for (int j = 0; j <= s * K; j++) { int x = j % i; ps[x] = (ps[x] + dp[i - 1][j]) % m; if (j - i * (K + 1) >= 0)ps[x] = (ps[x] + m - dp[i - 1][j - i * (K + 1)]) % m; dp[i][j] = ps[x]; } } s = 0; for (int x = 1; x <= n; x++) { ll ans = 0; s += x; for (int i = 0; i <= s * K; i++) { ans = (ans + 1ll * dp[n - x][i] * dp[x - 1][i] % m) % m; } ans = (ans*(K + 1) - 1 + m) % m; printf("%lld\n", ans); } return0; }