解いた問題

5/07/2012

SRM510 Div1 Easy

250

全通り試して間に合う。



lli bt(lli m, lli n, bool almost)
{
  if (m > n) return 0;
 
  lli ret = 1;
 
  ret += bt(m * 10LL + 4LL, n, almost);
  ret += bt(m * 10LL + 7LL, n, almost);

  if (!almost) {
    if (m) ret += bt(m * 10LL, n, true);
    for (lli i = 1; i <= 9; ++i) {
      if (i == 4 || i == 7) continue;
      ret += bt(m * 10LL + i, n, true);
    }
  }

  return ret;
}

class TheAlmostLuckyNumbersDivOne {
public:
  long long find(long long a, long long b)
  {
    lli A = bt(0, a - 1, false);
    lli B = bt(0, b, false);
    return B - A;
  }
};