#include <stdlib.h> //to use function atoi()
#include <stdio.h> //to use sprintf/printf/scanf
#include <cstring> //to use funtion strlen()
//solution1:O(n)*******************************
//function to get 10^n
int powerbaseten(int n){
int res=1;
while(n>0){
res*=10;
--n;
}
return res;
}
int CountOne_core(char *str){
if(!str||*str<'0'||*str>'9'||*str=='\0')
return 0;
//get first number and string length
int first=*str-'0';
int len=strlen(str);
//the end of recursion.0<=num<9
if(len==1&&first==0)
return 0;
if(len==1&&first>=1)
return 1;
int firstcount=0;
if(first>1)
firstcount=powerbaseten(len-1);
else if(first==1)//first may equals 0
firstcount=atoi(str+1)+1;
int othercount=first*(len-1)*powerbaseten(len-2);
int recursioncount=CountOne_core(str+1);
return firstcount+othercount+recursioncount;
}
int CountOne(int n){
if(n<=0)
return 0;
char str[20];
sprintf(str,"%d",n);
return CountOne_core(str);
}
//solution2:O(nlogn)
//get how many "1"s in number "n"
int OneNum(int n){
int num=0;
while(n){
if(n%10==1)
num++;
n/=10;
}
return num;
}
int CountOne_2(int n){
//if(n<=0) return 0;
int result=0;
for(int i=0;i<=n;++i){
result+=OneNum(i);
}
return result;
}
int main(){
int n;
scanf("%d",&n);
printf("%d\n",CountOne(n));
printf("%d\n",CountOne_2(n));
}