#include<algorithm> #include<chrono> #include<cstdio> #include<iostream> #include<random> #include<utility> #include<vector> using pii = std::pair<int, int>; using u64 = longlong; constexprint N = 2e5 + 10; constexpr u64 MOD = 998244353; constexpr u64 B = 100003; constexpr u64 P = 1373;
structRange { int l, r, qid; bool left; }; structQuery { Range x, y; u64 Lval, Rval; } query[N];
std::mt19937 rng(std::chrono::steady_clock::now().time_since_epoch().count()); int n, q; int a[N], L[N]; u64 hash[N], base[N]; std::vector<Range> range; std::vector<pii> rk;
u64 fw[N], count[N];
voidupdate(u64 *x, int i, u64 val){ for (; i <= n; i += i & -i) x[i] += val, x[i] %= MOD; } u64 get(u64 *x, int p){ u64 res = 0; for (; p > 0; p -= p & -p) res += x[p], res %= MOD; return res; } u64 get(u64 *x, int l, int r){ return ((get(x, r) - get(x, l - 1)) % MOD + MOD) % MOD; }
std::cin >> n >> q; base[0] = 1; hash[0] = 1; for (int i = 1; i <= n; i++) std::cin >> a[i], hash[i] = hash[i - 1] * B % MOD, base[i] = base[i - 1] * B % MOD; [&] { auto fpow = [&](u64 b, u64 p) { u64 res = 1; while (p) { if (p & 1) res = res * b % MOD; b = b * b % MOD; p >>= 1; } return res; }; for (int i = 1; i <= n; i++) { base[i] = fpow(base[i], MOD - 2) % MOD; } }();
[&] { // monotonous stack using pii = std::pair<int, int>; std::vector<pii> stk; stk.push_back({1e9 + 10, 0}); for (int i = 1; i <= n; i++) { while (!stk.empty() && stk.back().first <= a[i]) stk.pop_back(); L[i] = stk.back().second + 1; stk.push_back({a[i], i}); } }();
可以发现,只要 x 选的好,再令 d=len(x),那么 (10d−1)x 就基本上不会有相邻两个数位相同。所以我们只需要选好初值即可。
Code
1 2 3 4 5 6 7 8 9 10 11
import sys sys.set_int_max_str_digits(0)
a = int("4267185198539595929746816985463149678978597531947912876793684139682713457571713713824196914894814137") b = a print(a) for i inrange(1, 10): val = int("9" * len(str(b))) b *= val print(val)
#include<algorithm> #include<iostream> #include<queue> #include<utility> #include<vector> using i64 = longlong; using point = std::pair<i64, i64>; using vi = std::vector<int>; constexprint N = 2e5 + 10;
std::ostream &operator<<(std::ostream &os, const point &p) { return os << "(" << p.first << ", " << p.second << ")"; } point operator+(point a, point b) { return {a.first + b.first, a.second + b.second}; }
int n; point p[N]; int convex[N];
intmain(){ std::cin >> n; for (int i = 1; i <= n; i++) std::cin >> p[i].first >> p[i].second; std::sort(p + 1, p + 1 + n);
[&] { // extract useful points std::vector<point> stk; for (int i = 1; i <= n; i++) { while (!stk.empty() && p[i].second >= stk.back().second) stk.pop_back(); stk.push_back(p[i]); } for (int i = 1; i <= stk.size(); i++) p[i] = stk[i - 1]; n = stk.size(); }();
auto cross = [&](int px, int a, int b) { i64 v1x = p[a].first - p[px].first, v1y = p[a].second - p[px].second; i64 v2x = p[b].first - p[px].first, v2y = p[b].second - p[px].second; return v1x * v2y - v1y * v2x; };
std::vector<int> stk; int tp = -1; for (int i = 1; i <= n; i++) { while (tp >= 1 && cross(stk[tp - 1], stk[tp], i) >= 0) { convex[stk.back()] = false; stk.pop_back(); tp--; } convex[i] = true; stk.push_back(i); tp++; }
std::vector<point> dp(n + 1, {0, 0}); int cnt = 0, c1 = 0; for (int i = 1; i <= n; i++) { if (convex[i]) { continue; } int r = i; while (r <= n && !convex[r]) r++; // [i, r)
std::queue<int> q; for (int l = i; l < r; l++) { dp[l] = dp[l - 1] + point{1, 0}; while (!q.empty()) { int u = q.front(); point t = {p[l].first, p[u].second}; p[n + 1] = t; if (cross(i - 1, r, n + 1) <= 0) break; q.pop(); } if (!q.empty()) { dp[l] = std::min(dp[l], dp[q.front() - 1] + point{1, 1}); } q.push(l); }
#include<algorithm> #include<cassert> #include<iostream> constexprint N = 2e5 + 10; constexprint M = 524289; // 524288 + 1 constexprint MOD = 740294657; constexprint P = 3; using i64 = longlong;
int n, lim = 1; i64 a[M], r[M]; i64 op1[M], op2[M]; i64 p1[M], p2[M], p3[M], p[M]; int ans[N];
intfpow(int a, int b, int mod){ int res = 1; while (b) { if (b & 1) res = (i64)res * a % mod; a = (i64)a * a % mod; b >>= 1; } return res; }
voidNTT(i64 *d, int lim, int inv){ for (int i = 0; i < lim; i++) if (i > r[i]) std::swap(d[i], d[r[i]]);
for (int m = 2; m <= lim; m <<= 1) { int k = m >> 1; int gn = fpow(P, (MOD - 1) / m, MOD); for (int i = 0; i < lim; i += m) { int g = 1; for (int j = 0; j < k; j++, g = 1ll * g * gn % MOD) { int tmp = 1ll * d[i + j + k] * g % MOD; d[i + j + k] = (d[i + j] - tmp + MOD) % MOD; d[i + j] = (d[i + j] + tmp) % MOD; } } }
if (inv == -1) { std::reverse(d + 1, d + lim); int inv_lim = fpow(lim, MOD - 2, MOD); for (int i = 0; i < lim; i++) d[i] = 1ll * d[i] * inv_lim % MOD; } }