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; } };