TopCoder SRM 473 Div 2 Hard ChildlessNumbers
問題概要
整数nに対して、各桁の和D(n)がnを割り切るとき、n/D(n)を「nの親」と呼ぶ。
与えられた2数A,Bに対しこの間(境界含む)で、いかなる数の親にもなっていない数の個数を求めよ。
A≦B≦10^9, B-A≦10000を満たす。
解法
Xが子になるような数Yの候補の大きさを制限できないか考える。
Yが一番小さくなるのはD(Y)が1のときで、X≦Y,
Yが一番大きくなるのはYの数字が全て9のときで、Y≦(桁数)*9*Xであるので、
Yの候補としてX*200くらいまでを調べれば十分なことがわかる。
調べ方は総当りで200万通りしかないので総当りでよい。
ソースコード
ll cld(ll a) { int s=0; for(ll b=a;b;b/=10)s+=b%10; if(a%s)return -1; return a/s; } bool ok(ll x) { for(ll a=x;a<=200*x;a+=x) if(cld(a)==x)return 1; return 0; } class ChildlessNumbers { public: int howMany(int A, int B) { int ans=0; for(int i=A;i<=B;i++)if(!ok(i))ans++; return ans; } };