Problem:
Score : 300 points

Problem Statement

1000000000000001 dogs suddenly appeared under the roof of Roger's house, all of which he decided to keep. The dogs had been numbered 1 through 1000000000000001, but he gave them new names, as follows:

the dogs numbered 1,2,\cdots,26 were respectively given the names a, b, ..., z;

the dogs numbered 27,28,29,\cdots,701,702 were respectively given the names aa, ab, ac, ..., zy, zz;

the dogs numbered 703,704,705,\cdots,18277,18278 were respectively given the names aaa, aab, aac, ..., zzy, zzz;

the dogs numbered 18279,18280,18281,\cdots,475253,475254 were respectively given the names aaaa, aaab, aaac, ..., zzzy, zzzz;

the dogs numbered 475255,475256,\cdots were respectively given the names aaaaa, aaaab, ...;

and so on.

To sum it up, the dogs numbered 1, 2, \cdots were respectively given the following names:

a, b, ..., z, aa, ab, ..., az, ba, bb, ..., bz, ..., za, zb, ..., zz, aaa, aab, ..., aaz, aba, abb, ..., abz, ..., zzz, aaaa, ...

Now, Roger asks you:

"What is the name for the dog numbered N?"

Constraints

N is an integer.

1 \leq N \leq 1000000000000001

Input

Input is given from Standard Input in the following format:

N

Output

Print the answer to Roger's question as a string consisting of lowercase English letters.

Sample Input 1

2

Sample Output 1

b

Sample Input 2

27

Sample Output 2

aa

Sample Input 3

123456789

Sample Output 3

jjddja

Solution in C# (.NET Core 3.1.201) (judge verdict: Runtime Error)

using System;
using System.CodeDom;
using System.Collections.Generic;
using System.Diagnostics;
using System.Globalization;
using System.IO;
using System.Linq;
using System.Runtime.CompilerServices;
using System.Text;
using System.Xml.Schema;

namespace AtCoder
{
    static class Program_D
    {
        class Solver
        {
            int ri => sc.Integer();
            long rl => sc.Long();
            double rd => sc.Double();
            string rs => sc.Scan();
            StreamScanner sc = new StreamScanner(Console.OpenStandardInput());

            private int baseNum = 26;
            // 149-C - One Quadrillion and One Dalmatians
            public void Solve()
            {
                var n = rl;
                var keta = CalcKeta(n);

                var a = CreateArray(keta.Item1, keta.Item2);
                var str = new string(a.Select(tmp => (char)('a' + tmp)).ToArray());

                Wl(str);

                //TestKeta();
                //TestBaseArray();
            }

            private void TestBaseArray()
            {
                var vals = new int[] {0, 26-1, 26, 27, 28, 26*26-1, 26*26, 26 * 26+1, 26 *26*26-1, 26*26*26};
                foreach (var val in vals)
                {
                    var a = CreateArray(4, val);
                    //var str = string.Join("",a.Select(tmp => $"[{tmp}]"));
                    var str = new string(a.Select(tmp => (char) ('a' + tmp)).ToArray());
                    Wl($"{val} : {str}");

                }
            }

            void TestKeta()
            {
                var vals = new int[] { 1, 26, 27, 702, 703, 18278, 18279 };
                foreach (var val in vals)
                {
                    var keta = CalcKeta(val);
                    Wl($"{val} => {keta.Item1}, {keta.Item2}");
                }
            }

            Tuple<int,long> CalcKeta(long n)
            {
                int test = 0;
                for (int i = 1; i < 10; ++i)
                {
                    var nextTest = test + Pow(baseNum, i);
                    if (n <= nextTest)
                    {
                        return Tuple.Create(i,n-test-1);
                    }
                    test = nextTest;
                }
                return Tuple.Create(-1,-1L);
            }

            // nthは0オフセット.
            int[] CreateArray(int keta, long val)
            {
                var result = new int[keta];
                for (int i = 0; i < keta; ++i)
                {
                    result[i] = (int) (val%baseNum);
                    val /= baseNum;
                }
                Array.Reverse(result);
                return result;
            }



            // ----------------------------------------------------------------------------

            private static int Pow(int a, int b)
            {
                int result = 1;
                for (int i = 0; i < b; ++i)
                {
                    result *= a;
                }
                return result;
            }
            private static long Pow(long a, long b)
            {
                long result = 1;
                for (int i = 0; i < b; ++i)
                {
                    result *= a;
                }
                return result;
            }

            static public void Swap<T>(ref T a, ref T b) { var tmp = a; a = b; b = tmp; }


            string Rl()
            {
                return Console.ReadLine();
            }
            void Wl(UInt64 val)
            {
                Console.WriteLine(val);
            }
            void Wl(Int64 val)
            {
                Console.WriteLine(val);
            }
            void Wl(uint val)
            {
                Console.WriteLine(val);
            }
            void Wl(int val)
            {
                Console.WriteLine(val);
            }
            void Wl(double val)
            {
                Console.WriteLine(val);
            }
            void Wl(string mes)
            {
                Console.WriteLine(mes);
            }
            public int Int()
            {
                return int.Parse(Console.ReadLine());
            }

            public int[] Ints(int subtract)
            {
                return Console.ReadLine().Split(' ').Select(s => int.Parse(s) - subtract).ToArray();
            }
            public Int64[] Int64s(Int64 subtract)
            {
                return Console.ReadLine().Split(' ').Select(s => Int64.Parse(s) - subtract).ToArray();
            }
            public UInt64[] UInt64s(UInt64 subtract)
            {
                return Console.ReadLine().Split(' ').Select(s => UInt64.Parse(s) - subtract).ToArray();
            }


        }



        static void Main(string[] args)
        {
            //Console.SetOut(new Printer(Console.OpenStandardOutput()) { AutoFlush = false });
            new Solver().Solve();
            //Console.Out.Flush();
        }
    }

    public class Printer : StreamWriter
    {
        public override IFormatProvider FormatProvider => CultureInfo.InvariantCulture;
        public Printer(Stream stream) : base(stream, new UTF8Encoding(false, true)) { }
    }

    public class StreamScanner
    {
        public StreamScanner(Stream stream) { str = stream; }

        public readonly Stream str;
        private readonly byte[] buf = new byte[1024];
        private int len, ptr;
        public bool isEof = false;

        private byte read()
        {
            if (isEof) return 0;
            if (ptr >= len)
            {
                ptr = 0;
                if ((len = str.Read(buf, 0, 1024)) <= 0)
                {
                    isEof = true;
                    return 0;
                }
            }
            return buf[ptr++];
        }

        public char Char()
        {
            byte b = 0;
            do b = read(); while ((b < 33 || 126 < b) && !isEof);
            return (char)b;
        }
        public string Scan()
        {
            var sb = new StringBuilder();
            for (var b = Char(); b >= 33 && b <= 126; b = (char)read()) sb.Append(b);
            return sb.ToString();
        }
        public string ScanLine()
        {
            var sb = new StringBuilder();
            for (var b = Char(); b != '\n' && b != 0; b = (char)read()) if (b != '\r') sb.Append(b);
            return sb.ToString();
        }
        public long Long() { return isEof ? long.MinValue : long.Parse(Scan()); }
        public int Integer() { return isEof ? int.MinValue : int.Parse(Scan()); }
        public double Double() { return isEof ? double.NaN : double.Parse(Scan(), CultureInfo.InvariantCulture); }
    }

    struct ModInt
    {
        const int MOD = 1000000007;
        long Data;
        [MethodImpl(MethodImplOptions.AggressiveInlining)]
        public ModInt(long data) { if ((Data = data % MOD) < 0) Data += MOD; }
        [MethodImpl(MethodImplOptions.AggressiveInlining)]
        public static implicit operator long(ModInt modInt) => modInt.Data;
        [MethodImpl(MethodImplOptions.AggressiveInlining)]
        public static implicit operator ModInt(long val) => new ModInt(val);
        [MethodImpl(MethodImplOptions.AggressiveInlining)]
        public static ModInt operator +(ModInt a, ModInt b)
        {
            long res = a.Data + b.Data;
            return new ModInt() { Data = res >= MOD ? res - MOD : res };
        }
        [MethodImpl(MethodImplOptions.AggressiveInlining)]
        public static ModInt operator +(ModInt a, long b) => a.Data + b;
        [MethodImpl(MethodImplOptions.AggressiveInlining)]
        public static ModInt operator -(ModInt a, ModInt b)
        {
            long res = a.Data - b.Data;
            return new ModInt() { Data = res < 0 ? res + MOD : res };
        }
        [MethodImpl(MethodImplOptions.AggressiveInlining)]
        public static ModInt operator -(ModInt a, long b) => a.Data - b;
        [MethodImpl(MethodImplOptions.AggressiveInlining)]
        public static ModInt operator *(ModInt a, ModInt b) => new ModInt() { Data = a.Data * b.Data % MOD };
        [MethodImpl(MethodImplOptions.AggressiveInlining)]
        public static ModInt operator /(ModInt a, ModInt b) => a.Data * GetInverse(b);

        [MethodImpl(MethodImplOptions.AggressiveInlining)]
        public override string ToString() => Data.ToString();

        [MethodImpl(MethodImplOptions.AggressiveInlining)]
        static long GetInverse(long a)
        {
            long div;
            long p = MOD;
            long x1 = 1, y1 = 0, x2 = 0, y2 = 1;
            while (true)
            {
                if (p == 1) return x2;
                div = a / p;
                x1 -= x2 * div;
                y1 -= y2 * div;
                a %= p;
                if (a == 1) return x1;
                div = p / a;
                x2 -= x1 * div;
                y2 -= y1 * div;
                p %= a;
            }
        }
    }

}