Submission #1244960

#TimeUsernameProblemLanguageResultExecution timeMemory
1244960kaiboyPalindrome-Free Numbers (BOI13_numbers)C++20
100 / 100
1 ms328 KiB
#include <algorithm>
#include <iostream>

using namespace std;

const int N = 19;

int dd[N];
long long dp[10][10], dq[10][10];

long long solve(long long a) {
	if (a < 10)
		return a;
	int n = 0;
	for ( ; a; a /= 10)
		dd[n++] = a % 10;
	long long ans = 10;
	for (int i = 1; i + 1 < n; i++) {
		for (int d = 0; d < 10; d++)
			for (int e = 0; e < 10; e++) {
				long long x = 0;
				if (d != e)
					if (i == 1)
						x++;
					else
						for (int f = 0; f < 10; f++)
							if (d != f)
								x += dp[e][f];
				dq[d][e] = x;
				if (d)
					ans += x;
			}
		for (int d = 0; d < 10; d++)
			for (int e = 0; e < 10; e++)
				dp[d][e] = dq[d][e];
	}
	for (int i = n - 1; i >= 0; i--) {
		int d0 = dd[i];
		int d1 = i + 1 < n ? dd[i + 1] : -1;
		int d2 = i + 2 < n ? dd[i + 2] : -1;
		for (int d_ = i + 1 == n; d_ < d0; d_++) {
			if (d_ == d1 || d_ == d2)
				continue;
			if (!i) {
				ans++;
				continue;
			}
			for (int d = 0; d < 10; d++)
				for (int e = 0; e < 10; e++)
					dp[d][e] = e == d_ && d != e && d != d1;
			for (int j = i - 2; j >= 0; j--) {
				for (int d = 0; d < 10; d++)
					for (int e = 0; e < 10; e++) {
						long long x = 0;
						if (d != e)
							if (i == 1)
								x++;
							else
								for (int f = 0; f < 10; f++)
									if (d != f)
										x += dp[e][f];
						dq[d][e] = x;
					}
				for (int d = 0; d < 10; d++)
					for (int e = 0; e < 10; e++)
						dp[d][e] = dq[d][e];
			}
			for (int d = 0; d < 10; d++)
				for (int e = 0; e < 10; e++)
					ans += dp[d][e];
		}
		if (d0 == d1 || d0 == d2)
			break;
	}
	return ans;
}

int main() {
	long long l, r; cin >> l >> r;
	cout << solve(r + 1) - solve(l) << '\n';
	return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...