제출 #77201

#제출 시각아이디문제언어결과실행 시간메모리
77201VinhspmPalindrome-Free Numbers (BOI13_numbers)C++14
72.50 / 100
3 ms704 KiB
#include<bits/stdc++.h> using namespace std; #define fi first #define se second #define FOR(a, b, c) for(int a=b;a <= c;++a) #define pb push_back #define int long long const int N = 1e5 + 10; const int mod = 1e9 + 7; const int oo = 1e9; int n; int f[20][11][11][2]; void add(int &x, int y) { x = (x + y); } int solve(string maxn, int st) { memset(f, 0, sizeof f); f[0][0][0][0] = 1; FOR(i, 0, 17) FOR(las2, 0, 9) FOR(las1, 0, 9) { if(f[i][las2][las1][0]) { int h = maxn[i] - '0'; FOR(t, 0, h) if((i <= st) || (i == st + 1 && t != las1) || (t != las1 && t != las2)) { bool flag = 1; if(t == h) flag = false; add(f[i + 1][las1][t][flag], f[i][las2][las1][0]); //cout << f[i + 1][las1][t][flag] << ' ' << flag << '\n'; } } if(f[i][las2][las1][1]) { //cout << i << ' ' << las2 << ' ' << las1 << ' ' << f[i][las2][las1][1] << '\n'; FOR(t, 0, 9) if((i <= st) || (i == st + 1 && t != las1) || (t != las1 && t != las2)) { add(f[i + 1][las1][t][1], f[i][las2][las1][1]); } } } // we need f[18][las1][las2][0] int sum = 0; FOR(i, 0, 9) FOR(j, 0, 9) add(sum, f[18][i][j][0]), add(sum, f[18][i][j][1]); return sum; } signed main() { ios_base::sync_with_stdio(false); cin.tie(0); cout.tie(0); int l, r; cin >> l >> r; l --; string a = "", b = ""; while(l) a = char(l % 10 + 48) + a, l /= 10; int sa = 18 - a.length(); while(a.length() < 18) a = "0" + a; while(r) b = char(r % 10 + 48) + b, r /= 10; int sb = 18 - b.length(); while(b.length() < 18) b = "0" + b; //cout << b << ' ' << sb << ' ' << a << ' ' << sa << '\n'; cout << solve(b, sb) - solve(a, sa);// :D }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...