// // Problem: Elevator Hall Number // Solution by: MORI Shingo // DFA Answer // // implement 26min // debug 9min // #include #include #include #include #include #include #include #include #include #include #include #include using namespace std; typedef long long ll; typedef unsigned int uint; typedef unsigned long long ull; static const long double EPS = 1e-9; static const long double PI = acos(-1.0); #define REP(i, n) for (int i = 0; i < (int)(n); i++) #define FOR(i, s, n) for (int i = (s); i < (int)(n); i++) #define FOREQ(i, s, n) for (int i = (s); i <= (int)(n); i++) #define FORIT(it, c) for (__typeof((c).begin())it = (c).begin(); it != (c).end(); it++) #define MEMSET(v, h) memset((v), h, sizeof(v)) map, ll> memo; int n; int ls[10]; int rs[10]; ll calc(const set &state) { if (state.empty()) { return 0; } if (memo.count(state)) { return memo[state]; } ll &ret = memo[state] = 0; if (*state.rbegin() == n * 8) { ret++; } FOREQ(v, 0, 9) { set nstate; FORIT(it, state) { if (*it == n * 8) { continue; } int i = *it / 8; int s = *it % 8; assert(0 <= i && i < n); assert(0 <= s && s < 8); if (s == 0) { if (v != 0 && ls[i] / 10 <= v && v <= rs[i] / 10) { int ns = 1; if (ls[i] / 10 == v) { ns |= 2; } if (rs[i] / 10 == v) { ns |= 4; } nstate.insert(i * 8 + ns); } if (ls[i] <= v && v <= rs[i]) { nstate.insert((i + 1) * 8); } } else { int ni = i + 1; if ((s & 2) && v < ls[i] % 10) { continue; } if ((s & 4) && rs[i] % 10 < v) { continue; } nstate.insert(ni * 8); } } ret += calc(nstate); } return ret; } int main() { while (scanf("%d", &n) > 0 && n) { memo.clear(); REP(i, n) { int v = scanf("%d %d", &ls[i], &rs[i]); assert(v == 2); } set state; state.insert(0); ll ans = calc(state); printf("%lld\n", ans); } }