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.Linq;
using System.Collections.Generic;
using static System.Console;
using System.Text;
using System.IO;
using static System.Math;
namespace AtCoder
{
    class Program
    {
        static public long[] Sarray() { return ReadLine().Split().Select(long.Parse).ToArray(); }
        static public List<long> Slist() { return ReadLine().Split().Select(long.Parse).ToList(); }
        static long Mod = (long)1e9 + 7;
        static void Main(string[] args)
        {
            //SetOut(new StreamWriter(OpenStandardOutput()) { AutoFlush = false });
            var N = Sarray()[0];
            var dp = new long[10][][];
            for (var i = 0; i < 10; ++i)
            {
                dp[i] = new long[10][];
                for (var j = 0; j < 10; ++j)
                    dp[i][j] = new long[10];
            }
            for (var f = 1; f < 10; ++f)
            {
                for (var l = 1; l < 10; ++l)
                {
                    if (f == l && f <= N)
                        dp[f][l][1] = 1;
                    var kei = 10;
                    var km = 0;
                    for (var i = 2; i < 7; ++i)
                    {
                        var bsmin = f * kei + l;
                        var bsmax = bsmin + km;
                        var cnt = 0L;
                        if (bsmax <= N)
                            cnt = km / 10 + 1;
                        else if (bsmin <= N)
                            cnt = (N - bsmin) / 10 + 1;
                        else
                            cnt = 0;
                        dp[f][l][i] = cnt;
                        km = (km + 9) * 10;
                        kei *= 10;
                    }
                }
            }
            var ans = 0L;
            for (var f = 1; f < 10; ++f)
            {
                for (var l = 1; l < 10; ++l)
                {
                    ans += dp[f][l].Sum() * dp[l][f].Sum();
                }
            }
            WriteLine(ans);
            //Out.Flush();
        }

    }
}