using
System;
using
System.Collections.Generic;
class
GFG{
static
Dictionary<
long
,
long
> values =
new
Dictionary<
long
,
long
>();
public
static
void
intitializeMap()
{
values =
new
Dictionary<
long
,
long
>();
values.Add(1L, 0L);
values.Add(10L, 4L);
values.Add(100L, 4L);
values.Add(1000L, 454L);
values.Add(10000L, 454L);
values.Add(100000L, 45454L);
values.Add(1000000L, 45454L);
values.Add(10000000L, 4545454L);
values.Add(100000000L, 4545454L);
values.Add(1000000000L, 454545454L);
values.Add(10000000000L, 454545454L);
values.Add(100000000000L, 45454545454L);
values.Add(1000000000000L, 45454545454L);
values.Add(10000000000000L, 4545454545454L);
values.Add(100000000000000L, 4545454545454L);
values.Add(1000000000000000L, 454545454545454L);
values.Add(10000000000000000L, 454545454545454L);
values.Add(100000000000000000L, 45454545454545454L);
values.Add(1000000000000000000L, 45454545454545454L);
}
static
long
[] count_even_odd(
long
val)
{
long
even = 0, odd = 0;
while
(val > 0)
{
long
num = val % 10;
if
(num % 2 == 0)
even++;
else
odd++;
val /= 10;
}
return
(
new
long
[]{ even, odd });
}
static
bool
satisfies_condition(
long
num)
{
long
[] answer = count_even_odd(num);
long
even = answer[0];
long
odd = answer[1];
if
(even % 2 == 1 && odd % 2 == 0)
return
true
;
return
false
;
}
static
long
count_upto(
long
val)
{
if
(values.ContainsKey(val))
return
values[val];
long
index = 1;
for
(
int
i = 0;
i < val.ToString().Length - 1;
i++)
index *= 10;
if
(val.ToString().Length % 2 == 0)
return
values[index];
long
val_len = val.ToString().Length;
long
cnt = values[index];
long
left_end = index + 1;
cnt += (val - left_end) / 2;
if
(satisfies_condition(val) ||
satisfies_condition(left_end))
cnt++;
return
cnt;
}
public
static
void
Main(String[] args)
{
long
l = 123, r = 984;
intitializeMap();
long
right = count_upto(r);
long
left = 0;
if
(l ==
'1'
)
left = 0;
else
left = count_upto(l - 1);
Console.WriteLine(right - left);
}
}