Problem:
MathJax.Hub.Config({ tex2jax: { inlineMath: [["$","$"], ["\\(","\\)"]], processEscapes: true }});

Problem D:
IkaNumber

数直線上の整数座標に, ねこの Taro の家, にんじん, うさぎの Hanako の家がこの順に並んでいる. 点 $x$ にいるイカは, 一回のジャンプで $x + 1$ または $x + 2$ に移動することができる.

あなたは, イカが Taro の家から Hanako の家までにんじんの置かれている座標に止まらずに行く経路が何通りあるか求めようとしたが, Taro の家, にんじん, Hanako の家の座標を知らないので
求めることができなかった. そこで, 代わりに経路の数として考えられる数をすべて列挙することにした.

ある Taro の家, にんじん, Hanako の家の配置に対してイカの経路数となる整数をイカ数と呼ぶことにする. $K$ 番目に小さいイカ数 (1-indexed) を mod 1,000,000,007 で求めよ.

Constraints

$K$ will be between 1 and 1,000,000,000,000,000,000, inclusive.

Input

入力はイカの形式で与えられる:

$K$

Output

$K$ 番目に小さいイカ数を 1,000,000,007 で割った余りを 1 行に出力せよ.

Sample Input 1

5

Sample Output 1

5

Sample Input 2

8

Sample Output 2

9

Solution in C++11 (judge verdict: Accepted)

#include<bits/stdc++.h>
#define M 1000000007
using namespace std;long long k,I,A,xy,x[2],fib[2],a,i;double D;int dp[3],h;int main(){cin>>k;a=sqrt(k)/16;xy=(long long)(2*sqrt(k-a-0.01))-1;A=(xy+2)*(xy+2)/4;I=(xy+1)*(xy+1)/4+1;D=1.0*(A+I)/2;if(k<=D){x[1]=(k-I)*2;}else{x[1]=(A-k)*2+1;}x[0]=xy-x[1];for(h=0;h<2;h++){if(x[h]<3){fib[h]=x[h]+1;}else{dp[0]=1;dp[1]=2;dp[2]=3;for(i=3;i<=x[h];i+=3){dp[0]=(dp[1]+dp[2])%M;dp[1]=(dp[2]+dp[0])%M;dp[2]=(dp[0]+dp[1])%M;}fib[h]=dp[x[h]%3];}}cout<<(fib[0]*fib[1])%M<<endl;}