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 Ruby (judge verdict: Accepted)

def up(n)
  (10 ** (n+1) - 10 ** n) * (n+1) + count_fiz(n, n, 0, 1, 10)
end
def count_fiz(k, n, tmp, s, t)
  top = 10 ** k * t + tmp - 1
  btm = 10 ** k * s + tmp - 1 
  a =top/3  - btm/3 
  b =top/5  - btm/5
  c =top/15 - btm/15
  (a+b-c) * (3-n) + c * 4
end
def down(n, mod)
  ret = 10**n
  k = n
  while k >= 0
    9.times do
      t = 10 ** k * (n+1) + count_fiz(k, n, ret, 0, 1)
      if mod < t
        k -= 1
        break
      end
      ret += 10 ** k
      mod -= t
    end
  end
  [ret, mod]
end
num = gets.to_i - 1
n = 0
while (t = up(n)) < num
  n += 1
  num -= t
end
p, q = down(n, num)
puts (p..p+20).map{ |x| a = [[:Fizz][x%3], [:Buzz][x%5]] * ''; a == '' ? x : a }.join[q, 20]