for (int i = 0; i < n;) { term tmp; int j = i; while (j < n && !isdigit(a[j])) j++; if (i != j) tmp.sign = a[i];
int t1 = j; while (j < n && isdigit(a[j])) j++; tmp.val = a.substr(t1, j - t1);
i = j; t.push_back(tmp); }
for (auto &v : t) { if (v.sign != "-") { v.tf = v.val; continue; }
int m = v.val.length(); v.tf.push_back(v.val[0]); for (int i = 1; i < m; i++) { if (v.val[i] == '0') { v.tf.push_back('+'); v.tf.push_back(v.val[i]); } else { v.tf += "+"; v.tf += v.val.substr(i, m - i); break; } } }
for (auto v : t) std::cout << v.sign << v.tf; std::cout << "\n"; }
defadd(p): upper = res[p] lower = reduce(lambda x, y: x * y, [p - j for j inrange(7) if p != j])
rest = [k for k inrange(7) if k != p] apply = lambda f: reduce(lambda x, y: x * y, f) gTerms = lambda r: combinations(rest, r) mapped = lambda s: [apply(c) for c in gTerms(s)]
fac = [1] + [ reduce(lambda x, y: x + y, mapped(k)) * (1if k % 2 == 0else -1) for k inrange(1, 7) ]
ans = [Fraction(upper, lower) * v for v in fac] return ans
ans = [] final = [Fraction(0, 1)] * 7 for i inrange(7): fac = add(i) for j, fj inenumerate(fac): final[j] += fj
for i, f inenumerate(final): if f.up == 0: continue
#include<algorithm> #include<bits/stdc++.h> constexprint N = 1e5 + 10;
structtpl { int a, b, c; } tp[N]; int n, m; int f[N], ok[N]; std::vector<int> left[N], mid[N], right[N]; std::mt19937 rng(std::random_device{}()); int satis = 0; std::set<std::pair<int, int>> du;
intget(int s){ returnrng() % s + 1; } boolck(int a, int b, int c){ return (f[a] < f[b] && f[b] < f[c]) || (f[a] > f[b] && f[b] > f[c]); }
voidalter(){ int which = get(m); while (ok[which]) which = get(m); tpl x = tp[which]; int i = x.b, j = x.c; if (rng() % 2 == 1) i = x.a, j = x.b; std::tie(i, j) = std::pair{std::min(i, j), std::max(i, j)}; if (du.count({i, j})) return;
std::swap(f[i], f[j]); int rt = satis; auto maintain = [&](std::vector<int> &vi) { for (auto id : vi) { auto &[a, b, c] = tp[id]; rt -= ok[id]; ok[id] = ck(a, b, c); rt += ok[id]; } }; maintain(left[i]), maintain(mid[i]), maintain(right[i]); maintain(left[j]), maintain(mid[j]), maintain(right[j]);
if (rt < satis) { std::swap(f[i], f[j]), du.insert({i, j}); maintain(left[i]), maintain(mid[i]), maintain(right[i]); maintain(left[j]), maintain(mid[j]), maintain(right[j]); } else satis = rt, du.clear(); }
int data[N]; voidgendata(){ n = get(1e5); m = get(1e5); for (int i = 1; i <= n; i++) data[i] = i; std::shuffle(data + 1, data + 1 + n, rng);
for (int i = 1; i <= m; i++) { int l, mid, r; while (true) { l = get(n); if (l > n - 2) continue; mid = get(n - l) + l; if (mid > n - 1) continue; r = get(n - mid) + mid;
std::cin >> n >> m; for (int i = 1; i <= m; i++) { auto &[a, b, c] = tp[i]; std::cin >> a >> b >> c; left[a].push_back(i); mid[b].push_back(i); right[c].push_back(i); } for (int i = 1; i <= n; i++) f[i] = i; std::shuffle(f + 1, f + 1 + n, rng);
for (int i = 1; i <= m; i++) { auto &[a, b, c] = tp[i]; ok[i] = ck(a, b, c); satis += ok[i]; }
auto disp = [&](int c = 0) { std::cout << satis << "\n"; if (c) { for (int i = 1; i <= m; i++) std::cout << ok[i] << " \n"[i == m]; for (int i = 1; i <= n; i++) std::cout << f[i] << " \n"[i == n]; } std::cout << "\n"; }; // disp(1); while (satis * 2 < m) { alter(); // disp(1); } for (int i = 1; i <= n; i++) data[f[i]] = i; for (int i = 1; i <= n; i++) std::cout << data[i] << " \n"[i == n]; // disp(1); // disp(0), std::cout << satis * 2 << ", m = " << m << "\n"; }
#include<bits/stdc++.h> #include<random> using ll = longlong; constexprint N = 5e4 + 10; constexpr ll V = 1e6;
int n; ll t, p[N], d[N]; ll tree[N * 5], dp[N];
std::mt19937 rng{std::random_device{}()};
voidpushup(int p){ tree[p] = std::min(tree[p << 1], tree[p << 1 | 1]); } voidset(int pos, ll v, int p = 1, int l = 1, int r = n){ if (l == r) { tree[p] = v; return; } int mid = l + ((r - l) >> 1); if (pos <= mid) set(pos, v, p << 1, l, mid); elseset(pos, v, p << 1 | 1, mid + 1, r); pushup(p); } ll rquery(int ql, int qr, int p = 1, int l = 1, int r = n){ if (ql > r || qr < l) return (1e18); if (ql <= l && r <= qr) return tree[p]; int mid = l + ((r - l) >> 1); return std::min(rquery(ql, qr, p << 1, l, mid), rquery(ql, qr, p << 1 | 1, mid + 1, r)); }
boolcheck(int distance){ for (int i = 1; i <= n; i++) { dp[i] = 0; set(i, 1e18); } set(1, -1);
for (int i = 2; i <= n; i++) { int l = std::max(1, i - distance); dp[i] = rquery(l, i - 1) + i; set(i, dp[i] + d[i] - i); }
return dp[n] <= t; }
intbf(){ for (int i = 1; i <= n - 1; i++) if (check(i)) return i; assert(false); }