256382026-02-23 20:23:12GeneratrollSzivárványszámokcpp17Elfogadva 45/453ms756 KiB
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
struct B {
	vector<int> v;
	B() {}
	B(ll n) {
		if (n == 0) {
			v.push_back(0);
		}
		while (n > 0) {
			v.push_back(n % 10);
			n /= 10;
		}
	}
	void operator+=(B o) {
		int c = 0, i = 0;
		while (i < v.size() || i < o.v.size() || c) {
			int x = 0, y = 0;
			if (i < v.size()) {
				x = v[i];
			}
			if (i < o.v.size()) {
				y = o.v[i];
			}
			int z = x + y + c;
			if (i < v.size()) {
				v[i] = z % 10;
			} else {
				v.push_back(z % 10);
			}
			c = z / 10;
			i++;
		}
	}
	void s() {
		int i = 0;
		while (v[i] == 0) {
			v[i] = 9;
			i++;
		}
		v[i]--;
		while (v.size() > 1 && v.back() == 0) {
			v.pop_back();
		}
	}
	void p() {
		int i = v.size();
		while (i > 0) {
			i--;
			cout << v[i];
		}
		cout << '\n';
	}
};
int main() {
	ios::sync_with_stdio(false);
	cin.tie(nullptr);
	string s;
	cin >> s;
	int n = s.length(), j = 6200;
	vector<B> q(j);
	vector<bool> h(j, false);
	auto g = [&](int i, int p, int t, bool l, bool r) {
		return (((i * 10 + p) * 2 + t) * 2 + (l ? 1 : 0)) * 2 + (r ? 1 : 0);
	};
	auto e = [&](auto self, int i, int p, int t, bool l, bool r) -> B {
		if (i == n) {
			return B(1);
		}
		int k = g(i, p, t, l, r);
		if (h[k]) {
			return q[k];
		}
		B z(0);
		int b = l ? 9 : s[i] - '0';
		for (int d = 0; d <= b; d++) {
			bool u = l || (d < b);
			bool w = r || (d > 0);
			if (!w) {
				z += self(self, i + 1, 0, 0, u, false);
			} else if (!r) {
				z += self(self, i + 1, d, 0, u, true);
			} else {
				if (t == 0) {
					if (d >= p) {
						z += self(self, i + 1, d, 0, u, true);
					} else {
						z += self(self, i + 1, d, 1, u, true);
					}
				} else {
					if (d <= p) {
						z += self(self, i + 1, d, 1, u, true);
					}
				}
			}
		}
		h[k] = true;
		q[k] = z;
		return z;
	};
	auto f = [&](string r) {
		int m = r.length();
		if (m <= 1) {
			return true;
		}
		int t = 0;
		for (int i = 1; i < m; i++) {
			int x = r[i - 1] - '0', y = r[i] - '0';
			if (t == 0) {
				if (y < x) {
					t = 1;
				}
			} else {
				if (y > x) {
					return false;
				}
			}
		}
		return true;
	};
	B a = e(e, 0, 0, 0, false, false);
	if (f(s)) {
		a.s();
	}
	a.p();
	return 0;
}

RészfeladatÖsszpontTesztVerdiktIdőMemória
base45/45
1Elfogadva0/01ms564 KiB
2Elfogadva0/01ms568 KiB
3Elfogadva0/02ms564 KiB
4Elfogadva1/11ms564 KiB
5Elfogadva1/11ms564 KiB
6Elfogadva1/11ms564 KiB
7Elfogadva1/11ms564 KiB
8Elfogadva1/11ms568 KiB
9Elfogadva1/12ms564 KiB
10Elfogadva1/11ms756 KiB
11Elfogadva1/12ms564 KiB
12Elfogadva1/12ms564 KiB
13Elfogadva2/21ms564 KiB
14Elfogadva2/21ms564 KiB
15Elfogadva2/21ms564 KiB
16Elfogadva2/21ms564 KiB
17Elfogadva1/11ms564 KiB
18Elfogadva2/22ms564 KiB
19Elfogadva2/22ms564 KiB
20Elfogadva2/22ms564 KiB
21Elfogadva3/32ms632 KiB
22Elfogadva2/22ms564 KiB
23Elfogadva2/21ms564 KiB
24Elfogadva2/22ms564 KiB
25Elfogadva2/22ms568 KiB
26Elfogadva2/22ms564 KiB
27Elfogadva2/23ms564 KiB
28Elfogadva2/22ms564 KiB
29Elfogadva2/23ms564 KiB
30Elfogadva2/23ms568 KiB