A
首先把原数组中的数按题目要求进行转化
状态表示\(f[i][j]\)表示从前\(i\)个选,凑成的数组为\(j\)的所有方案数
#include <bits/stdc++.h> #define int long long using namespace std; const int N = 1e5 + 10, MOD = 998244353; int n; int a[N], f[N][10]; signed main() { scanf("%lld", &n); for (int i = 1; i <= n; i ++ ) scanf("%lld", &a[i]); for (int i = 1; i <= n; i ++ ) { int m = a[i]; while (m >= 10) { int sum = 0; while (m) { sum += m % 10; m /= 10; } m = sum; } a[i] = m; } f[0][0] = 1; for (int i = 1; i <= n; i ++ ) { for (int j = 1; j <= 9; j ++ ) { f[i][j] = (f[i][j] + f[i - 1][j]) % MOD; int m = (a[i] + j) % 10; if (a[i] + j >= 10) m ++; f[i][m] = (f[i][m] + f[i - 1][j]) % MOD; } f[i][a[i]] = (f[i][a[i]] + 1) % MOD; } for (int i = 1; i <= 9; i ++ ) printf("%d ", f[n][i]); return 0; }
C
模拟
#include <bits/stdc++.h> using namespace std; int n; int main() { scanf("%d", &n); int cnt = 0; int last1 = 0, last2 = 0, last3 = 0; for (int i = 1; i <= n; i ++ ) { int a, b, c; cin >> a >> b >> c; if (c) { if (last3 < 1) { cnt ++; last1 ++; last2 ++; last3 = 1; } } if (b) { if (last2 < 2) { cnt += (2 - last2); last1 += (2 - last2); last2 = 2; } } if (a) { if (last1 < 3) { cnt += (3 - last1); last2 += (3 - last1); last1 = 3; } } last3 = last2; last2 = last1; last1 = 0; } printf("%d\n", cnt); return 0; }
D
对于问题一打表找规律
对于问题二从大到小遍历,找到第一个质数
#include <bits/stdc++.h> #define int long long using namespace std; int T, n, l, r; int primes[] = {2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59,61,67,71,73,79,83,89,97}; bool is_prime(int x) { if (x < 2) return false; for (int i = 2; i <= x / i; i ++ ) if (x % i == 0) return false; return true; } signed main() { scanf("%d", &T); while (T -- ) { scanf("%lld", &n); if (n == 1) {printf("-1\n"); continue;} int sum = 1; for (int i = 0; i <= 24; i ++ ) { if (sum * primes[i] > n) { printf("%d ", sum); break; } else sum *= primes[i]; } for (int i = n; ; i -- ) { if (is_prime(i)) { printf("%d\n", i); break; } } } return 0; }
E
签到
#include <bits/stdc++.h> using namespace std; int T, n, m; int main() { scanf("%d", &T); while (T -- ) { scanf("%d%d", &n, &m); if (n == m && m == 1) {printf("1\n"); continue;} if (m == 1) {printf("-1\n"); continue;} int k = (int)ceil((n - m) * 1.0 / (m - 1) * 1.0); printf("%d\n", k * 2 + 1); } return 0; }
F
签到
#include <bits/stdc++.h> using namespace std; const int N = 1e5 + 10; int T, n, m, sum; int a[N]; int main() { scanf("%d", &T); while (T -- ) { sum = 0; scanf("%d%d", &n, &m); for (int i = 1; i <= n; i ++ ) scanf("%d", &a[i]); for (int i = 1; i <= n; i ++ ) { if (a[i] >= m) sum ++; else sum --; } printf("%d\n", sum > 0 ? sum : -1); } return 0; }
H
前缀和
#include <bits/stdc++.h> #define int long long using namespace std; const int N = 1e6 + 10; int n, tot, sum; int a[N], b[N], s[N]; signed main() { scanf("%lld", &n); for (int i = 1; i <= n; i ++ ) scanf("%lld", &a[i]); sort(a + 1, a + 1 + n); for (int i = 1; i <= n; i ++ ) s[i] = s[i - 1] + a[i]; for (int i = 1; i <= n; i ++ ) { int l = i, r = n; while (l < r) { int mid = l + r >> 1; if (a[mid] >= 1000 - a[i]) r = mid; else l = mid + 1; } int k = n - l + 1; if (k >= l - i) sum += a[i] * (k - l + i); else sum -= a[i] * (l - i - k); sum += s[n] - s[l - 1]; sum -= s[l - 1] - s[i - 1]; tot += l - i; } if (n * (n + 1) / 2 - tot >= tot) sum -= (n * (n + 1) / 2 - tot * 2) * 1000; else sum += (tot * 2 - n * (n + 1) / 2) * 1000; printf("%lld\n", sum); return 0; }
I
概率 + 逆元
答案为\(m \times \frac{2^n-2}{2^n}\)
#include <bits/stdc++.h> using namespace std; const int MOD = 1e9 + 7; int T, n, m; int qmi(int m, int k, int p) { int res = 1 % p, t = m; while (k) { if (k & 1) res = (long long)res * t % p; t = (long long)t * t % p; k >>= 1; } return res; } int main() { scanf("%d", &T); while (T -- ) { scanf("%d%d", &n, &m); printf("%d\n", (long long)m * (qmi(2, n, MOD) - 2) % MOD * (qmi(qmi(2, n, MOD), MOD - 2, MOD)) % MOD); } return 0; }
J
#include <bits/stdc++.h> #define x first #define y second #define PII pair<int, int> using namespace std; const int N = 1e4 + 10; int T, n, m, s; int a[N], b[N]; int main() { scanf("%d", &T); while (T -- ) { scanf("%d%d%d", &n, &m, &s); vector<PII> v; for (int i = 1; i <= n; i ++ ) { int x; scanf("%d", &x); v.push_back({x, 1}); } for (int i = 1; i <= m; i ++ ) { int x; scanf("%d", &x); v.push_back({x, 0}); } sort(v.begin(), v.end()); reverse(v.begin(), v.end()); if (n < (s + 1) / 2) {printf("-1\n"); continue;} else { int sum0 = 0, sum1 = 0, sum = 0; for (int i = 0; sum0 + sum1 < s; i ++ ) { if (v[i].y == 1) { sum0 ++; sum += v[i].x; } else { if (sum1 < s / 2) { sum += v[i].x; sum1 ++; } } } printf("%d\n", sum); } } return 0; }
L
#include <bits/stdc++.h> using namespace std; const int N = 1010; int T, n, x, y; double ans; char s[N]; int main() { scanf("%d", &T); while (T -- ) { scanf("%d", &n); scanf("%s", s + 1); x = 0, y = 0, ans = 0.0; for (int i = 1; i <= n; i ++ ) { if (s[i] == 'L') x --; else if (s[i] == 'R') x ++; else if (s[i] == 'U') y ++; else y --; ans = max(ans, sqrt(x * x * 1.0 + y * y * 1.0)); } printf("%.10lf\n", ans); } return 0; }