@qq290637843
2020-11-24T20:30:02.000000Z
字数 16541
阅读 246
#include <bits/stdc++.h>std::stringstream iss;std::stringstream oss;std::string instr;using ul = std::uint32_t;using li = std::int32_t;using ull = std::uint64_t;using ll = std::int64_t;const ul mod = 1e9 + 7;ul plus(ul a, ul b){return a + b < mod ? a + b : a + b - mod;}ul minus(ul a, ul b){return a < b ? a + mod - b : a - b;}ul mul(ul a, ul b){return ull(a) * ull(b) % mod;}ul T;ul n;const ul maxn = 2e5;ul inv[maxn + 2];ul H[maxn + 2];int main(){std::ios::sync_with_stdio(false);std::cin.tie(0);iss.tie(0);oss.tie(0);std::getline(std::cin, instr, char(0));iss.str(instr);inv[1] = 1;H[1] = 1;for (ul i = 2; i <= maxn + 1; ++i) {inv[i] = minus(0, mul(mod / i, inv[mod % i]));H[i] = plus(H[i - 1], inv[i]);}iss >> T;for (ul Case = 1; Case <= T; ++Case) {iss >> n;ul ans = 0;for (ul k = 1; k <= n; ++k) {ul t;iss >> t;ul alpha = 0;alpha = plus(alpha, mul(n + 1, H[n]));alpha = minus(alpha, mul(k, H[k]));alpha = minus(alpha, mul(n + 1 - k, H[n - k]));ans = plus(ans, mul(alpha, t));}ans = mul(mul(ans, mul(inv[n + 1], inv[n])), 2);oss << ans << '\n';}std::cout << oss.str();return 0;}
简单题
#include <bits/stdc++.h>std::stringstream iss;std::stringstream oss;std::string instr;using ul = std::uint32_t;using li = std::int32_t;using ull = std::uint64_t;using ll = std::int64_t;std::string s;std::vector<ul> a, b, c;const ul base = 998244353;ul plus(ul a, ul b){return a + b < base ? a + b : a + b - base;}ul minus(ul a, ul b){return a < b ? a + base - b : a - b;}ul mul(ul a, ul b){return ull(a) * ull(b) % base;}void exgcd(li a, li b, li& x, li& y){if (b) {exgcd(b, a % b, y, x);y -= a / b * x;} else {x = 1;y = 0;}}ul inverse(ul a){li x, y;exgcd(a, base, x, y);return x < 0 ? x + li(base) : x;}bool check(char x){return '0' <= x && x <= '9' || 'A' <= x && x <= 'F';}ul encode[256];bool check(ul r, char op){ul aa = 0, bb = 0, cc = 0;for (auto t : a) {if (t >= r) {return false;}aa = mul(aa, r);aa = plus(aa, t);}for (auto t : b) {if (t >= r) {return false;}bb = mul(bb, r);bb = plus(bb, t);}for (auto t : c) {if (t >= r) {return false;}cc = mul(cc, r);cc = plus(cc, t);}if (op == '+') {return plus(aa, bb) == cc;} else if (op == '-') {return minus(aa, bb) == cc;} else if (op == '*') {return mul(aa, bb) == cc;} else {return mul(aa, inverse(bb)) == cc;}}int main(){std::ios::sync_with_stdio(false);std::cin.tie(0);iss.tie(0);oss.tie(0);std::getline(std::cin, instr, char(0));iss.str(instr);for (ul i = '0'; i <= '9'; ++i) {encode[i] = i - '0';}for (ul i = 'A'; i <= 'F'; ++i) {encode[i] = i - 'A' + 10;}while (iss >> s) {a.resize(0);b.resize(0);c.resize(0);ul i;for (i = 0; i != s.size() && check(s[i]); ++i) {a.push_back(encode[s[i]]);}char op = s[i];for (++i; i != s.size() && check(s[i]); ++i) {b.push_back(encode[s[i]]);}for (++i; i != s.size() && check(s[i]); ++i) {c.push_back(encode[s[i]]);}bool flag = false;for (ul r = 2; r <= 16; ++r) {if (check(r, op)) {oss << r << '\n';flag = true;break;}}if (!flag) {oss << "-1\n";}}std::cout << oss.str();return 0;}
官方题解如下:

#include <bits/stdc++.h>std::stringstream iss;std::stringstream oss;std::string instr;using ul = std::uint32_t;using li = std::int32_t;using ull = std::uint64_t;using ll = std::int64_t;const ul base = 998244353;ul plus(ul a, ul b){return a + b < base ? a + b : a + b - base;}ul minus(ul a, ul b){return a < b ? a + base - b : a - b;}ul mul(ul a, ul b){return ull(a) * ull(b) % base;}ul T;const ul maxn = 1e6;ul fac[maxn + 1];ul fiv[maxn + 1];ul inv[maxn + 1];ul twopowinv[maxn + 1];ul x, y, z;ul sbi(ul a, ul b){return mul(fac[a + b], mul(fiv[a], fiv[b]));}int main(){std::ios::sync_with_stdio(false);std::cin.tie(0);iss.tie(0);oss.tie(0);std::getline(std::cin, instr, char(0));iss.str(instr);fac[0] = 1;for (ul i = 1; i <= maxn; ++i) {fac[i] = mul(fac[i - 1], i);}inv[1] = 1;fiv[0] = fiv[1] = 1;for (ul i = 2; i <= maxn; ++i) {inv[i] = base - mul(base / i, inv[base % i]);fiv[i] = mul(fiv[i - 1], inv[i]);}twopowinv[0] = 1;for (ul i = 1; i <= maxn; ++i) {twopowinv[i] = mul(twopowinv[i - 1], inv[2]);}iss >> T;for (ul Case = 1; Case <= T; ++Case) {iss >> x >> y >> z;if (x < z) {std::swap(x, z);}if (x < y) {std::swap(x, y);}ul a = x - y, b = x - z;if ((a + b) % 3 != 0) {oss << "-1\n";continue;}if (a >= b + b) {oss << (a + a - b) / 3 * 2 << '\n';continue;}if (b >= a + a) {oss << (b + b - a) / 3 * 2 << '\n';continue;}ul na = (a + a - b) / 3, nb = (b + b - a) / 3;a = na;b = nb;ul ans = 0;for (ul s = 1; s <= a; ++s) {ans = plus(ans, mul(mul(s + a + b, sbi(a - s, b - 1)), twopowinv[a + b - s]));}for (ul t = 1; t <= b; ++t) {ans = plus(ans, mul(mul(t + a + b, sbi(a - 1, b - t)), twopowinv[a + b - t]));}oss << ans << '\n';}std::cout << oss.str();return 0;}
简单题
#include <bits/stdc++.h>std::stringstream iss;std::stringstream oss;std::string instr;using ul = std::uint32_t;using li = std::int32_t;using ull = std::uint64_t;using ll = std::int64_t;class vec {public:ll x = 0;ll y = 0;vec()=default;vec(ll a, ll b): x(a), y(b) {}};vec operator+(const vec& a, const vec& b){return vec(a.x + b.x, a.y + b.y);}vec operator-(const vec& a, const vec& b){return vec(a.x - b.x, a.y - b.y);}ll operator*(const vec& a, const vec& b){return a.x * b.x + a.y * b.y;}ll operator^(const vec& a, const vec& b){return a.x * b.y - a.y * b.x;}ul T;ul n;std::vector<vec> star[3];std::vector<vec> buttom;std::vector<vec> top;ll findans(const std::vector<vec>& v, const vec& a, const vec& b){vec dir = b - a;ul l = 0, r = v.size();while (l + 1 != r) {ul mid = l + r >> 1;ul midl = mid - 1;if ((dir ^ v[mid]) >= (dir ^ v[midl])) {l = mid;} else {r = mid;}}return dir ^ (v[l] - a);}int main(){std::ios::sync_with_stdio(false);std::cin.tie(0);iss.tie(0);oss.tie(0);std::getline(std::cin, instr, char(0));iss.str(instr);iss >> T;for (ul Case = 1; Case <= T; ++Case) {star[0].resize(0);star[1].resize(0);star[2].resize(0);iss >> n;for (ul i = 1; i <= n; ++i) {vec tmp;ul c;iss >> tmp.x >> tmp.y >> c;star[c].push_back(tmp);}for (ul c = 0; c <= 2; ++c) {if (star[c].size() == 1) {continue;}std::sort(star[c].begin(), star[c].end(), [](const vec& a, const vec& b){return a.x != b.x ? a.x < b.x : a.y < b.y;});buttom.resize(0);for (const auto& curr : star[c]) {while (buttom.size() >= 2 && (buttom.back() - buttom[buttom.size() - 2] ^ curr - buttom.back()) <= 0) {buttom.pop_back();}buttom.push_back(curr);}std::reverse(star[c].begin(), star[c].end());top.resize(0);for (const auto& curr : star[c]) {while (top.size() >= 2 && (top.back() - top[top.size() - 2] ^ curr - top.back()) <= 0) {top.pop_back();}top.push_back(curr);}star[c].resize(0);for (const auto& curr : buttom) {star[c].push_back(curr);}star[c].pop_back();for (const auto& curr : top) {star[c].push_back(curr);}star[c].pop_back();}if (star[0].size() < star[1].size()) {std::swap(star[0], star[1]);}if (star[0].size() < star[2].size()) {std::swap(star[0], star[2]);}std::sort(star[0].begin(), star[0].end(), [](const vec& a, const vec& b){return a.x != b.x ? a.x < b.x : a.y < b.y;});buttom.resize(0);for (const auto& curr : star[0]) {while (buttom.size() >= 2 && (buttom.back() - buttom[buttom.size() - 2] ^ curr - buttom.back()) <= 0) {buttom.pop_back();}buttom.push_back(curr);}std::reverse(star[0].begin(), star[0].end());top.resize(0);for (const auto& curr : star[0]) {while (top.size() >= 2 && (top.back() - top[top.size() - 2] ^ curr - top.back()) <= 0) {top.pop_back();}top.push_back(curr);}ll ans = 0;for (const auto& a : star[1]) {for (const auto& b : star[2]) {if (a.x > b.x) {ans = std::max(ans, findans(buttom, a, b));ans = std::max(ans, findans(top, b, a));} else {ans = std::max(ans, findans(top, a, b));ans = std::max(ans, findans(buttom, b, a));}}}oss << (ans >> 1) << ((ans & 1) ? ".5\n" : ".0\n");}std::cout << oss.str();return 0;}
简单题
#include <bits/stdc++.h>std::stringstream iss;std::stringstream oss;std::string instr;using ul = std::uint32_t;using li = std::int32_t;using ull = std::uint64_t;using ll = std::int64_t;const ul maxlen = 11;std::string s = " 1145141919114514191911451419191145141919114514191911451419191145141919114514191911451419191145141919";std::vector<ul> ans[maxlen + 1][maxlen + 1];li out[5001];ul T;ul n;ul cnt;int main(){std::ios::sync_with_stdio(false);std::cin.tie(0);iss.tie(0);oss.tie(0);std::getline(std::cin, instr, char(0));iss.str(instr);for (ul len = 1; len <= maxlen; ++len) {for (ul l = 1, r = l + len - 1; r <= maxlen; ++l, ++r) {if (len <= 4) {ul t = 0;for (ul i = l; i <= r; ++i) {t *= 10;t += s[i] - '0';}if (t <= 5000) {ans[l][r].push_back(t);}}for (ul ml = l, mr = l + 1; mr <= r; ++ml, ++mr) {for (ul a : ans[l][ml]) {for (ul b : ans[mr][r]) {if (a + b <= 5000) {ans[l][r].push_back(a + b);}if (a * b <= 5000) {ans[l][r].push_back(a * b);}}}std::sort(ans[l][r].begin(), ans[l][r].end());ans[l][r].resize(std::unique(ans[l][r].begin(), ans[l][r].end()) - ans[l][r].begin());}if (l == 1) {for (auto t : ans[l][r]) {if (!out[t]) {out[t] = r;++cnt;}}}}}out[3] = out[7] = -1;iss >> T;for (ul Case = 1; Case <= T; ++Case) {iss >> n;oss << out[n] << '\n';}std::cout << oss.str();return 0;}
简单题
#include <bits/stdc++.h>std::stringstream iss;std::stringstream oss;std::string instr;using ul = std::uint32_t;using li = std::int32_t;using ull = std::uint64_t;using ll = std::int64_t;const ul mod = 1e9 + 7;ul plus(ul a, ul b){return a + b < mod ? a + b : a + b - mod;}ul mul(ul a, ul b){return ull(a) * ull(b) % mod;}ul T;ul n, m;const ul maxn = 1e5;ul fa[maxn + 1];ul rk[maxn + 1];ul cnt[maxn + 1][3];ul al[2];std::vector<std::pair<ul, ul>> edge[maxn + 1];ul getfather(ul x){return x == fa[x] ? x : fa[x] = getfather(fa[x]);}bool connect(ul x, ul y){x = getfather(x);y = getfather(y);if (x == y) {return false;}if (rk[x] > rk[y]) {fa[y] = x;} else if (rk[x] < rk[y]) {fa[x] = y;} else {fa[y] = x;++rk[x];}return true;}ul ans;void search(ul curr, ul prev){for (const auto& e : edge[curr]) {ul next = e.first;ul v = e.second;if (next == prev) {continue;}search(next, curr);ans = plus(ans, mul(v, mul(cnt[next][0], al[1] - cnt[next][4])));ans = plus(ans, mul(v, mul(cnt[next][5], al[0] - cnt[next][0])));cnt[curr][0] += cnt[next][0];cnt[curr][6] += cnt[next][7];}}int main(){std::ios::sync_with_stdio(false);std::cin.tie(0);iss.tie(0);oss.tie(0);std::getline(std::cin, instr, char(0));iss.str(instr);iss >> T;for (ul Case = 1; Case <= T; ++Case) {al[0] = al[1] = 0;iss >> n >> m;for (ul i = 1; i <= n; ++i) {fa[i] = i;rk[i] = 0;cnt[i][0] = cnt[i][8] = 0;ul a;iss >> a;cnt[i][a] = 1;++al[a];edge[i].resize(0);}ans = 0;for (ul i = 1, t = 2; i <= m; ++i, t = plus(t, t)) {ul u, v;iss >> u >> v;if (connect(u, v)) {edge[u].push_back(std::pair<ul, ul>(v, t));edge[v].push_back(std::pair<ul, ul>(u, t));}}search(1, 0);oss << ans << '\n';}std::cout << oss.str();return 0;}
#include <bits/stdc++.h>std::stringstream iss;std::stringstream oss;std::string instr;using ul = std::uint32_t;using li = std::int32_t;using ull = std::uint64_t;using ll = std::int64_t;const ul base = 1e9 + 7;ul plus(ul a, ul b){return a + b < base ? a + b : a + b - base;}ul minus(ul a, ul b){return a < b ? a + base - b : a - b;}ul mul(ul a, ul b){return ull(a) * ull(b) % base;}ul mpow(ul a, ul b){ul ret = 1;while (b) {if (b & 1) {ret = mul(a, ret);}a = mul(a, a);b >>= 1;}return ret;}ul T;ul n, x, k;const ul maxn = 2e5;ul mu[maxn + 1];ul mu2[maxn + 1];ul smuixk[maxn + 1];ul smu2ixk[maxn + 1];ul sik[maxn + 1];ul sik_x[maxn + 1];bool notprime[maxn + 1];std::vector<ul> prime;ul ans;ul ans2[maxn + 1];bool al[maxn + 1];int main(){std::ios::sync_with_stdio(false);std::cin.tie(0);iss.tie(0);oss.tie(0);std::getline(std::cin, instr, char(0));iss.str(instr);iss >> T >> k >> x;mu[1] = 1;mu2[1] = 1;smuixk[1] = 1;smu2ixk[1] = 1;for (ul i = 2; i <= maxn; ++i) {if (!notprime[i]) {prime.push_back(i);mu[i] = minus(0, 1);mu2[i] = 1;}smuixk[i] = plus(mul(mu[i], mpow(mpow(i, x), k)), smuixk[i - 1]);smu2ixk[i] = plus(mul(mul(mu2[i], mpow(mpow(i, x), k)), i), smu2ixk[i - 1]);for (ul p : prime) {if (i * p > maxn) {break;}notprime[i * p] = true;if (i % p == 0) {mu[i * p] = 0;mu2[i * p] = 0;break;} else {mu[i * p] = minus(0, mu[i]);mu2[i * p] = mu2[i];}}}for (ul i = 1; i <= maxn; ++i) {ul ik = mpow(i, k);sik[i] = plus(sik[i - 1], ik);sik_x[i] = mpow(sik[i], x);}for (ul Case = 1; Case <= T; ++Case) {iss >> n;ul ans = 0;for (ul d = 1, dd; d <= n; d = dd + 1) {ul nqd = n / d;dd = n / nqd;if (!al[nqd]) {al[nqd] = true;for (ul e = 1, ee; e <= nqd; e = ee + 1) {ul nqdqe = nqd / e;ee = nqd / nqdqe;ans2[nqd] = plus(ans2[nqd], mul(minus(smuixk[ee], smuixk[e - 1]), sik_x[nqdqe]));}}ans = plus(ans, mul(minus(smu2ixk[dd], smu2ixk[d - 1]), ans2[nqd]));}oss << ans << '\n';}std::cout << oss.str();return 0;}
见此
简单题
#include <bits/stdc++.h>std::stringstream iss;std::stringstream oss;std::string instr;using ul = std::uint32_t;using li = std::int32_t;using ull = std::uint64_t;using ll = std::int64_t;ul T;ull b, x;int main(){std::ios::sync_with_stdio(false);std::cin.tie(0);iss.tie(0);oss.tie(0);std::getline(std::cin, instr, char(0));iss.str(instr);iss >> T;for (ul Case = 1; Case <= T; ++Case) {iss >> b >> x;oss << (b % x == 1 ? "T\n" : "F\n");}std::cout << oss.str();return 0;}
简单题 矩阵树定理证明见此
#include <bits/stdc++.h>std::stringstream iss;std::stringstream oss;std::string instr;using ul = std::uint32_t;using li = std::int32_t;using ull = std::uint64_t;using ll = std::int64_t;const ul base = 998244353;ul plus(ul a, ul b){return a + b < base ? a + b : a + b - base;}ul minus(ul a, ul b){return a < b ? a + base - b : a - b;}ul mul(ul a, ul b){return ull(a) * ull(b) % base;}void exgcd(li a, li b, li& x, li& y){if (b) {exgcd(b, a % b, y, x);y -= a / b * x;} else {x = 1;y = 0;}}ul inverse(ul a){li x, y;exgcd(a, base, x, y);return x < 0 ? x + li(base) : x;}ul T;ul n, m;const ul maxn = 100;ul mat[32][maxn + 1][maxn + 1];ul smat[maxn + 1][maxn + 1];ul det(ul a[][maxn + 1], ul n){ul ret = 1;for (ul i = 1; i <= n; ++i) {ul id;for (id = i; i <= n && !a[id][i]; ++i);if (id != i) {for (ul j = i; j <= n; ++j) {std::swap(a[i][j], a[id][j]);}ret = minus(0, ret);}ret = mul(ret, a[i][i]);for (ul j = i + 1; j <= n; ++j) {ul tmp = minus(0, mul(a[j][i], inverse(a[i][i])));for (ul k = i; k <= n; ++k) {a[j][k] = plus(a[j][k], mul(a[i][k], tmp));}}}return ret;}int main(){std::ios::sync_with_stdio(false);std::cin.tie(0);iss.tie(0);oss.tie(0);std::getline(std::cin, instr, char(0));iss.str(instr);iss >> T;for (ul Case = 1; Case <= T; ++Case) {iss >> n >> m;for (ul i = 0; i != 32; ++i) {for (ul j = 1; j <= n; ++j) {std::memset(mat[i][j] + 1, 0, sizeof(ul) * n);}}for (ul i = 1; i <= n; ++i) {std::memset(smat[i] + 1, 0, sizeof(ul) * n);}for (ul i = 1; i <= m; ++i) {ul u, v, w;iss >> u >> v >> w;smat[u][u] = plus(smat[u][u], 1);smat[v][v] = plus(smat[v][v], 1);smat[u][v] = minus(smat[u][v], 1);smat[v][u] = minus(smat[v][u], 1);for (ul j = 0; j != 32; ++j) {if (w >> j & 1) {mat[j][u][u] = plus(mat[j][u][u], 1);mat[j][v][v] = plus(mat[j][v][v], 1);mat[j][u][v] = minus(mat[j][u][v], 1);mat[j][v][u] = minus(mat[j][v][u], 1);}}}ul s = det(smat, n - 1);ul ans = 0;for (ul i = 31; ~i; --i) {ans = plus(ans, ans);ans = plus(ans, det(mat[i], n - 1));}oss << mul(ans, inverse(s)) << '\n';}std::cout << oss.str();return 0;}
线段极角排序裸题
#include <bits/stdc++.h>std::stringstream iss;std::stringstream oss;std::string instr;using ul = std::uint32_t;using li = std::int32_t;using ull = std::uint64_t;using ll = std::int64_t;const ul base = 31607;ul plus(ul a, ul b){return a + b < base ? a + b : a + b - base;}ul minus(ul a, ul b){return a < b ? a + base - b : a - b;}ul mul(ul a, ul b){return a * b % base;}void exgcd(li a, li b, li& x, li& y){if (b) {exgcd(b, a % b, y, x);y -= a / b * x;} else {x = 1;y = 0;}}ul inverse(ul a){li x, y;exgcd(a, base, x, y);return x < 0 ? x + li(base) : x;}ul reg(li a){a %= li(base);return a < 0 ? a + li(base) : a;}ul T;ul n;const ul maxn = 1e3;class vec {public:li x = 0;li y = 0;vec()=default;vec(li a, li b): x(a), y(b) {}};vec operator+(const vec& a, const vec& b){return vec(a.x + b.x, a.y + b.y);}vec operator-(const vec& a, const vec& b){return vec(a.x - b.x, a.y - b.y);}li operator*(const vec& a, const vec& b){return a.x * b.x + a.y * b.y;}li operator^(const vec& a, const vec& b){return a.x * b.y - a.y * b.x;}vec point[maxn + 1];ul p[maxn + 1];using pulul = std::pair<ul, ul>;std::vector<pulul> dirs;li sgn(li x){return x < 0 ? -1 : (x > 0 ? 1 : 0);}ul type(const vec& v){static const ul types[3][3] = {{3, 3, 2}, {4, 0, 2}, {4, 1, 1}};return types[sgn(v.x) + 1][sgn(v.y) + 1];}bool cmp(const vec& a, const vec& b, const vec& c, const vec& d){vec ab = b - a;vec cd = d - c;ul tab = type(ab);ul tcd = type(cd);if (tab != tcd) {return tab < tcd;}li tmp = ab ^ cd;if (tmp != 0) {return tmp > 0;}vec ac = c - a;tmp = ab ^ ac;if (tmp != 0) {return tmp > 0;}tmp = ab * ac;if (tmp != 0) {return tmp > 0;}return ab * (d - b) > 0;}ul ord[maxn + 1];ul pos[maxn + 1];ul pre[maxn + 1];int main(){std::ios::sync_with_stdio(false);std::cin.tie(0);iss.tie(0);oss.tie(0);std::getline(std::cin, instr, char(0));iss.str(instr);pre[0] = 1;iss >> T;for (ul Case = 1; Case <= T; ++Case) {iss >> n;for (ul i = 1; i <= n; ++i) {iss >> point[i].x >> point[i].y;ul u, v;iss >> u >> v;p[i] = mul(u, inverse(v));}dirs.resize(0);for (ul i = 1; i + 1 <= n; ++i) {for (ul j = i + 1; j <= n; ++j) {dirs.push_back(pulul(i, j));dirs.push_back(pulul(j, i));}}std::sort(dirs.begin(), dirs.end(), [](const pulul& a, const pulul& b){return cmp(point[a.first], point[a.second], point[b.first], point[b.second]);});for (ul i = 1; i <= n; ++i) {ord[i] = i;}std::sort(ord + 1, ord + n + 1, [](ul a, ul b){return point[a].y != point[b].y ? point[a].y < point[b].y : point[a].x < point[b].x;});for (ul i = 1; i <= n; ++i) {pos[ord[i]] = i;pre[i] = mul(pre[i - 1], minus(1, p[ord[i]]));}ul ans = 0;for (const auto dir : dirs) {ans = plus(mul(mul(mul(p[dir.first], p[dir.second]), pre[pos[dir.first] - 1]), reg(point[dir.first] ^ point[dir.second])), ans);std::swap(pos[dir.first], pos[dir.second]);pre[pos[dir.second]] = mul(pre[pos[dir.second] - 1], minus(1, p[dir.second]));}oss << mul(ans, inverse(2)) << '\n';}std::cout << oss.str();return 0;}