Problem:
FizzBuzz

FizzBuzzとは、1以上の整数を順に、以下のルールに従って発言していくゲームである。

3で割り切れる時には「Fizz」

5で割り切れる時には「Buzz」

3と5の両方で割り切れる時には「FizzBuzz」

それ以外の時はその数字

ゲームの進行状況の例を以下に示す。

1, 2, Fizz, 4, Buzz, Fizz, 7, 8, Fizz, Buzz, 11, Fizz, 13, 14, FizzBuzz, 16, …

得られた発言を1つの文字列に結合し得られた文字列をFizzBuzz Stringと呼ぶ。インデックスsが与えられるので、FizzBuzz Stringのs文字目から20文字を出力せよ。但し、インデックスは1から始まるものとし、得られた文字列の長さは十分に大きい（s+20以上）としてよい。

Input

入力は以下の形式で与えられる

s

Constraints

sは整数である

1 ≤ s ≤ 1018

Output

FizzBuzz Stringのs文字目から20文字を1行に出力せよ

Sample Input 1

1

Output for the Sample Input 1

12Fizz4BuzzFizz78Fiz

Sample Input 2

20

Output for the Sample Input 2

zzBuzz11Fizz1314Fizz

Sample Input 3

10000000000

Output for the Sample Input 3

93FizzBuzz1418650796

Solution in C# (judge verdict: Accepted)

using System;

public class hello
{
    public static void Main()
    {
        var n = long.Parse(Console.ReadLine().Trim());
        var ret = getStart(n);
        var ans = getAns(ret + 1, n);
        Console.WriteLine(ans);
    }
    public static string getAns(long st, long n)
    {
        var a = getL(st - 1);
        var w = "";
        if (n == 1) st = 1;
        for (long i = st; i <= st + 20; i++)
        {
            if (i % 15 == 0) w += "FizzBuzz";
            else if (i % 3 == 0) w += "Fizz";
            else if (i % 5 == 0) w += "Buzz";
            else w += i.ToString();
        }
        if (n == 1) return w.Substring(0, 20);
        else return w.Substring((int)(n - a - 1), 20);
    }
    public static long getStart(long n)
    {
        var ng = n;
        var ok = 1L;
        while (ng - ok > 1)
        {
            var mid = (ng + ok) / 2;
            if (getL(mid) < n) ok = mid;
            else ng = mid;
        }
        return ok;
    }
    public static long getL(long n)
    {
        var m = n.ToString().Length;
        var ret = fs(n);
        if (m == 1) return ret;
        while (m >= 2)
        {
            var t = (long)Math.Pow(10, m - 1) - 1;
            ret += fs(t);
            m--;
        }
        return ret;
    }
    public static long fs(long n)
    {
        var m = n.ToString().Length;
        var st = (long)Math.Pow(10, m - 1) - 1;
        var c15 = n / 15 - st / 15;
        var c35 = (n / 3 - st / 3) + (n / 5 - st / 5) - c15 * 2;
        var cother = n - st  - c15 - c35;
        return 8 * c15 + 4 * c35 + m * cother;
    }
}