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;

namespace _2441
{
	class Program
	{
		static long index;

		static long Calc(long key)//Finish letter count(1-indexed)
		{
			//only_num
			long ret = 0;
			for (int i = 0; i < key.ToString().Length; i++)
			{
				ret += key - ((long)Math.Pow(10, i) - 1);
			}
			//fizzbuzz
			ret += (key / 3 + key / 5) * 4;
			//-fizzbuzz_num
			for (int i = 0; i < key.ToString().Length; i++)
			{
				long a = (long)Math.Pow(10, i) - 1;
				ret -= (key / 3 + key / 5 - key / 15) - (a / 3 + a / 5 - a / 15);
			}
			return ret;
		}

		static bool IsOK(long key)
		{
			long a = Calc(key);
			if (a <= index) return true;
			else return false;
		}

		static long Binary_search()
		{
			long ok = 0;
			long ng = 1000000000000000000;

			while (Math.Abs(ok - ng) > 1)
			{
				long mid = ng + (ok - ng) / 2;

				if (IsOK(mid)) ok = mid;
				else ng = mid;
			}

			return ok;
		}
		static void Main(string[] args)
		{
			index = long.Parse(Console.ReadLine());
			long x = Binary_search();//文字数でおさまる最大の数字
			long l = Calc(x - 1) + 1;//xが始まるカウント
			long remain = index - l;
			string ret = "";
			for (long i = -remain; i < 20; x++)
			{
				if (x % 15 == 0)
				{ ret += "FizzBuzz"; i += 8; }
				else if (x % 3 == 0)
				{ ret += "Fizz"; i += 4; }
				else if (x % 5 == 0)
				{ ret += "Buzz"; i += 4; }
				else
				{ ret += x.ToString(); i += x.ToString().Length; }
			}
			Console.WriteLine(ret.Substring((int)remain, 20));
		}
	}
}