import std.stdio, std.array, std.string, std.conv, std.algorithm; import std.typecons, std.range, std.random, std.math, std.container; import std.numeric, std.bigint, core.bitop, core.stdc.stdio; bool is_kaibun(string s) { int n = s.length.to!int; foreach (i; 0..n/2) { if (s[i] != s[n-i-1]) return false; } return true; } void main() { long N = readln.chomp.to!long; long M = 10^^9; long a = N / M; if (a == 0) { writeln(0); return; } string s = a.to!string; long b = s.length; long ans = 0; foreach (i; 1..b+1) { if (i == b) { ans += 10 ^^ (i/2+i%2-1) * (s[0].to!string.to!long-1); } else { if (i == 1) ans += 9; else ans += 10^^(i/2+i%2); } } long keta = b-1; keta = keta/2+keta%2; long base = a - (a % 10^^(b-1)); foreach (i; 0..10^^keta) { string aida; aida = i.to!string; long nnn; if (b > 1) { nnn = base + (aida).to!long*10 + s[0].to!string.to!long; } else { nnn = base; } if (!(is_kaibun(nnn.to!string))) continue; long mmm = nnn*10^^9 + nnn; if (mmm <= N) ans++; } ans.writeln; }