SRM484 Div1 Easy(250), Div2 Medium(550) RabbitNumber
S(n+m)≦S(n)+S(m)。等号成立はn+mの計算で繰り上がりが発生しないとき。x=Σdi10iとすると、S(x)*S(x)=ΣiΣjdidj。筆算を考えれば、繰り上がりが発生しないときS(x*x)=S(x)*S(x)。その必要条件は任意のiについてdi≦3。
int next( int n ) { n++; int b = 1; while ( n/b%10 >= 4 ) n = n/b/10*b*10 + b*10, b *= 10; return n; } int S( long long n ) { int c = 0; while ( n > 0 ) c += n % 10, n /= 10; return c; } class RabbitNumber{public: int theCount( int low, int high ) { int c = 0; for ( int x=low; x<=high; x=next(x) ) if ( S((long long)x*x) == S(x)*S(x) ) c++; return c; }};