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)

//#undef DEBUG
using System;
using System.Collections;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Numerics;
using System.Runtime.InteropServices;
using System.Text;
using System.Text.RegularExpressions;
using System.Threading.Tasks;
using static System.Math;
using MethodImplAttribute = System.Runtime.CompilerServices.MethodImplAttribute;
using MethodImplOptions = System.Runtime.CompilerServices.MethodImplOptions;

public static class P
{
    public static void Main()
    {
        ulong n = ulong.Parse(Console.ReadLine()) - 1;
        ulong valid = 0;
        ulong invalid = (ulong)1e18;
        while (invalid - valid > 1)
        {
            var mid = (valid + invalid) / 2;
            if (GetLengthUntil(mid) <= n) valid = mid;
            else invalid = mid;
        }
        var curInd = GetLengthUntil(valid);
        string s = "";
        for (ulong i = valid + 1; i < valid + 20; i++)
        {
            if (i % 3 == 0) s += "Fizz";
            if (i % 5 == 0) s += "Buzz";
            if (i % 3 != 0 && i % 5 != 0) s += i;
        }
        Console.WriteLine(s.Substring((int)(n - curInd), 20));
    }
    static ulong GetLengthUntil(ulong n)
    {
        ulong res = 0;
        for (ulong Base = 1, digit = 1; Base <= n; Base *= 10, digit++)
        {
            var lowerBound = Base - 1;
            var upperBound = Min(Base * 10 - 1, n);
            var fizzBuzzCount = upperBound / 15 - lowerBound / 15;
            var fizzCount = upperBound / 3 - lowerBound / 3 - fizzBuzzCount;
            var buzzCount = upperBound / 5 - lowerBound / 5 - fizzBuzzCount;
            var numCount = upperBound - lowerBound - (fizzBuzzCount + fizzCount + buzzCount);
            res += numCount * digit + fizzCount * 4 + buzzCount * 4 + fizzBuzzCount * 8;
        }
        return res;
    }
}