#include #include using namespace std; using i64 = long long; class range {private: struct I{int x;int operator*(){return x;}bool operator!=(I& lhs){return x>>> dp(n+1, vector>>(2, vector>(2, vector(2)))); // dp[0][0][0][0] = 1; // for(int i : range(n)) { // for(int j : range(2)) { // for(int k1 : range(2)) { // for(int k2 : range(2)) { // for(int d : range(j?10:s[i]-'0'+1)) { // int flag = j || d < s[i] - '0'; // dp[i+1][flag][k1||(i==0&&d==2)][k2||(i==n-1&&d==2)] += dp[i][j][k1][k2]; // } // } // } // } // } // debug(dp[n][0]); // debug(dp[n][1]); // i64 res = 0; // for(int j : range(2)) { // res += dp[n][j][1][1]; // } // return res; } i64 f(i64 x) { string s = to_string(x); int n = s.size(); // dp[i桁見てる][未満フラグ][前の桁が1だった?]['12'の個数] vector>>> dp(n+1, vector>>(2, vector>(2, vector(11)))); dp[0][0][0][0] = 1; for(int i : range(n)) { for(int j : range(2)) { for(int k : range(2)) { for(int x : range(10)) { for(int d : range(j?10:s[i]-'0'+1)) { int flag = j || d < s[i] - '0'; dp[i+1][flag][d==1][x+(k&&d==2)] += dp[i][j][k][x]; } } } } } i64 res = 0; for(int j : range(2)) { for(int k : range(2)) { for(int x : range(11)) { res += dp[n][j][k][x] * x; } } } return res; } int main(void) { i64 a, b; scanf("%lld%lld", &a, &b); i64 res = f(b) - f(a-1); res += g(b) - g(a); printf("%lld\n", res); return 0; }