#include <iostream>
#include <cmath>
#include <cstdlib>
using namespace std;
long long f[20];
int count(int n) {
int count = 0;
int factor = 1;
int pos = 0;
while (true) {
int m = n / factor;
if (m == 0) //Past last digit
break;
int d = m % 10;
count += d * pos * factor / 10;
if (d == 2)
count += n % factor;
else if (d > 2) {
count += factor;
}
factor = 10 * factor;
pos++;
}
return count;
}
int twos(int n , int k)
{
if(n<2)
return 0;
else if(n<10)
return 1;
int msb = n/(int)pow(10,k);
int remainder = n%(int)pow(10,k);
if(msb==2) // eg 230 , calculate 200 ... to 230 , and find twos from 0 on 199 and recursion on 30
return msb*(f[k]) + (remainder+1) + twos(remainder,k-1); // 2*(below 100) + 31 + tows(30)
else if (msb>=3)
return msb*(f[k]) + pow(10,k) + twos(remainder,k-1); // for 312 -> 3*(below 100) + 100 + twos(12)
else
return msb*(f[k]) + twos(remainder,k-1);
}
int brute(int n)
{
int cnt=0;
for(int i=1 ; i<=n;i++)
{
int j=i;
while(j)
{
cnt+=(j%10==2)?1:0;
j/=10;
}
}
return cnt;
}
int main()
{
int i,j,k;
f[1] = 1;
for(i=2;i<=18;i++)
f[i]=10*f[i-1] + pow(10,i-1);
srand(NULL);
for(i=2 , j=1; i< 100000000 ; i+=(rand()%((int)pow(10,j))) , j++ )
cout<<i<<" " <<count(i)<<" "<< twos(i,j)<<" \n";
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8Y21hdGg+CiNpbmNsdWRlIDxjc3RkbGliPgp1c2luZyBuYW1lc3BhY2Ugc3RkOwpsb25nIGxvbmcgZlsyMF07CmludCBjb3VudChpbnQgbikgewogIGludCBjb3VudCA9IDA7CiAgaW50IGZhY3RvciA9IDE7CiAgaW50IHBvcyA9IDA7CiAgd2hpbGUgKHRydWUpIHsKICAgIGludCBtID0gbiAvIGZhY3RvcjsKICAgIGlmIChtID09IDApIC8vUGFzdCBsYXN0IGRpZ2l0CiAgICAgIGJyZWFrOwogICAgaW50IGQgPSBtICUgMTA7ICAgICAgCgogICAgY291bnQgKz0gZCAqIHBvcyAqIGZhY3RvciAvIDEwOyAKCiAgICBpZiAoZCA9PSAyKQogICAgICBjb3VudCArPSBuICUgZmFjdG9yOwogICAgZWxzZSBpZiAoZCA+IDIpIHsKICAgICAgY291bnQgKz0gZmFjdG9yOyAKICAgIH0KCiAgICBmYWN0b3IgPSAxMCAqIGZhY3RvcjsKICAgIHBvcysrOwogIH0KCiAgcmV0dXJuIGNvdW50Owp9ICAKaW50IHR3b3MoaW50IG4gLCBpbnQgaykKewogICAgaWYobjwyKQogICAgICAgIHJldHVybiAwOwogICAgZWxzZSBpZihuPDEwKQogICAgICAgIHJldHVybiAxOwoKICAgIGludCBtc2IgPSBuLyhpbnQpcG93KDEwLGspOwogICAgaW50IHJlbWFpbmRlciA9IG4lKGludClwb3coMTAsayk7CgogICAgaWYobXNiPT0yKSAvLyBlZyAyMzAgLCAgY2FsY3VsYXRlIDIwMCAuLi4gdG8gMjMwICAsIGFuZCBmaW5kIHR3b3MgZnJvbSAwIG9uIDE5OSAgYW5kIHJlY3Vyc2lvbiBvbiAzMAogICAgICAgIHJldHVybiBtc2IqKGZba10pICsgKHJlbWFpbmRlcisxKSArIHR3b3MocmVtYWluZGVyLGstMSk7IC8vIDIqKGJlbG93IDEwMCkgKyAzMSArIHRvd3MoMzApCiAgICBlbHNlIGlmIChtc2I+PTMpCiAgICAgICAgIHJldHVybiBtc2IqKGZba10pICsgcG93KDEwLGspICsgdHdvcyhyZW1haW5kZXIsay0xKTsgIC8vIGZvciAzMTIgLT4gMyooYmVsb3cgMTAwKSArIDEwMCArIHR3b3MoMTIpCiAgICBlbHNlCiAgICAgICAgcmV0dXJuICBtc2IqKGZba10pICsgdHdvcyhyZW1haW5kZXIsay0xKTsKCn0KCmludCBicnV0ZShpbnQgbikKewoJaW50IGNudD0wOwogICAgZm9yKGludCBpPTEgOyBpPD1uO2krKykKICAgIHsKICAgIAlpbnQgaj1pOwogICAgCXdoaWxlKGopCiAgICAJewogICAgCQljbnQrPShqJTEwPT0yKT8xOjA7CiAgICAJCWovPTEwOwogICAgCX0KICAgIH0KcmV0dXJuIGNudDsKfQoKCmludCBtYWluKCkKewoKaW50IGksaixrOwogIGZbMV0gPSAxOwogIGZvcihpPTI7aTw9MTg7aSsrKQogICAgIGZbaV09MTAqZltpLTFdICsgcG93KDEwLGktMSk7CgpzcmFuZChOVUxMKTsKCiAgZm9yKGk9MiAsIGo9MTsgIGk8IDEwMDAwMDAwMCA7ICBpKz0ocmFuZCgpJSgoaW50KXBvdygxMCxqKSkpICwgaisrICkKICAJY291dDw8aTw8IiAgIiA8PGNvdW50KGkpPDwiICAiPDwgdHdvcyhpLGopPDwiICBcbiI7CgoKCglyZXR1cm4gMDsKfQo=