Problem:
Score : 400 points

Problem Statement

Given is a positive integer N.

Find the number of pairs (A, B) of positive integers not greater than N that satisfy the following condition:

When A and B are written in base ten without leading zeros, the last digit of A is equal to the first digit of B, and the first digit of A is equal to the last digit of B.

Constraints

1 \leq N \leq 2 \times 10^5

All values in input are integers.

Input

Input is given from Standard Input in the following format:

N

Output

Print the answer.

Sample Input 1

25

Sample Output 1

17

The following 17 pairs satisfy the condition: (1,1), (1,11), (2,2), (2,22), (3,3), (4,4), (5,5), (6,6), (7,7), (8,8), (9,9), (11,1), (11,11), (12,21), (21,12), (22,2), and (22,22).

Sample Input 2

1

Sample Output 2

1

Sample Input 3

100

Sample Output 3

108

Sample Input 4

2020

Sample Output 4

40812

Sample Input 5

200000

Sample Output 5

400000008

Solution in C# (Mono 4.6.2.0) (judge verdict: Accepted)

using System;
using System.Collections;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Text.RegularExpressions;

namespace AtCoder
{
	public class ABC
	{
		static readonly int mod = 1000000007;  // 10^9+7

		static void Main(string[] args)
		{
			Console.SetOut(new StreamWriter(Console.OpenStandardOutput()) { AutoFlush = false });


			string s = Console.ReadLine();
			int n = int.Parse(s);
			//int n = int.Parse(Console.ReadLine());
			//long x = long.Parse(Console.ReadLine());
			//int[] p = Console.ReadLine().Split().Select(int.Parse).ToArray();
			//System.Diagnostics.Debug.WriteLine(n);
			long ans = 0;
			for (int i = 1; i <= n; i++) {
				if (i % 10 != 0) {
					int h = i, t = i % 10;
					while (h >= 10) {
						h /= 10;
					}
					// 1桁
					if (h == t) {
						ans++;
						//System.Diagnostics.Debug.WriteLine($"  {i},{h}");
					}
					// 2桁
					if (t * 10 + h <= n) {
						ans++;
						//System.Diagnostics.Debug.WriteLine($"  {i},{t * 10 + h}");
					}
					// 3桁～
					int k = 100;
					while (true) {
						int tmp1 = t * k + h;
						int tmp2 = t * k + k - 10 + h;
						if (tmp1 <= n) {
							if (tmp2 <= n) {
								ans += (k - 10) / 10 + 1;
								//System.Diagnostics.Debug.WriteLine($"  {i},{tmp1}-{tmp2}:{(k - 10) / 10 + 1}");
							} else {
								int x = (n % k) / 10;
								tmp2 = t * k + x * 10 + h;
								while (tmp2 > n) {
									x--;
									tmp2 = t * k + x * 10 + h;
								}
								ans += x + 1;
								//System.Diagnostics.Debug.WriteLine($"  {i},{tmp1}-{tmp2}:{x + 1}");
							}
						} else {
							break;
						}
						k *= 10;
					}
				}
			}
			Console.WriteLine(ans);


			Console.Out.Flush();
		}
	}
}