Div2 1000 ChildlessNumbers

問題

X の各桁の数字を足し合わせた数を D(X) で表す.このとき A≦Y≦B の整数 Y のうち X をどう取っても Y=X/D(X) とならない Y はいくつある?

考え方

Y の範囲が狭いので,チェックしたい Y が条件を満たすか試せばいい.Y が X/D(X) となってるとき X=Y*D(X) である.なので D(X) の範囲さえ分かればその範囲で X=Y*Z としてチェック.
X=Y*D(X) と Y≦B≦109 から X≦109 が分かり,D(X)≦9*(1+log10X) から Z=D(X)≦99 で大丈夫なはず.プログラムでは一応(ちょっとだけ余裕を見て)上限を 100 にしてる.

コード

class ChildlessNumbers
{
  long long D(long long X)
  {
    long long sum = 0;
    for( ; X ; X /= 10 ) sum += X % 10;
    return sum;
  }
  bool isParent(long long y)
  {
    for( long long z = 1 ; z <= 100 ; ++z )
      if( z == D(z * y) ) return true;
    return false;
  }
public:
  int howMany(int A, int B)
  {
    int cnt = 0;
    for( long long i = A ; i <= B ; ++i )
      if( !isParent(i) ) ++cnt;
    return cnt;
  }
};