#include <vector>
#include <list>
#include <map>
#include <set>
#include <deque>
#include <stack>
#include <bitset>
#include <algorithm>
#include <functional>
#include <numeric>
#include <utility>
#include <sstream>
#include <queue>
#include <iostream>
#include <iomanip>
#include <cstdio>
#include <complex>
#include <cmath>
#include <cstdlib>
#include <cctype>
#include <string>
#include <cstring>
#include <ctime>
#include <fstream>
#include <stdio.h>

using namespace std;

//conversion
//------------------------------------------
inline int toInt(string s) {int v; istringstream sin(s);sin>>v;return v;}
template<class T> inline string toString(T x) {ostringstream sout;sout<<x;return sout.str();}

//typedef
//------------------------------------------
typedef vector<int> VI;
typedef vector<VI> VVI;
typedef vector<double> VEC;
typedef vector<VEC> MAT;
typedef vector<string> VS;
typedef pair<int, int> PII;
typedef pair<int, PII> TIII;
typedef long long LL;
typedef vector<LL> VLL;
typedef vector<VLL> VVLL;
//container util

//------------------------------------------
#define ALL(a)  (a).begin(),(a).end()
#define RALL(a) (a).rbegin(), (a).rend()
#define PB push_back
#define MP make_pair
#define SZ(a) int((a).size())
#define EACH(i,c) for(typeof((c).begin()) i=(c).begin(); i!=(c).end(); ++i)
#define EXIST(s,e) ((s).find(e)!=(s).end())
#define SORT(c) sort((c).begin(),(c).end())
#define MT(a,b,c) MP(a, MP(b, c))
#define T1 first
#define T2 second.first
#define T3 second.second

//repetition
//------------------------------------------
#define FOR(i,a,b) for(int i=(a);i<(b);++i)
#define REP(i,n)  FOR(i,0,n)
#define MOD 1000000007

//AOJ2372
LL fib(int k){//k番目のfibonacci数を求める
	LL a[2][2]={{1,1},{1,0}};
	LL t[2][2];
	LL b[2][2]={{1,0},{0,1}};
	if(k==0)return 1;
	k--;
	while(k){
		if(k&1){
			memset(t,0,sizeof(t));
			REP(p,2)REP(q,2)REP(r,2)t[p][q] += (a[p][r]*b[r][q]) % MOD;
			REP(p,2)REP(q,2)b[p][q]=(t[p][q]%MOD);
		}
		memset(t,0,sizeof(t));
		REP(p,2)REP(q,2)REP(r,2)t[p][q] += (a[p][r]*a[r][q]) % MOD;
		REP(p,2)REP(q,2)a[p][q]=(t[p][q]%MOD);
		k>>=1;
	}
	return (b[0][0]+b[0][1])%MOD;
}

int main(){
	LL u,l,f,g,s,k;
	cin >> k;
	u=2000000000;
	l=0;
	while(u-l>1){
		LL mid=(u+l)/2;
		if(k<=mid*(mid+1))u=mid;
		else l=mid;
	}
	if(k<=u*(u+1))f=u;
	else f=l;
	g=k-f*(f-1);
	if(k<=f*f)s=2*f;
	else{
		g-=f;
		s=2*f+1;
	}
	if(g*2<=f+1)g=2*g-1;
	else{
		g-=(f+1)/2+1;
		g=f-2*g-(f%2);
	}
	cout << (fib(g)*fib(s-g)%MOD) << endl;
	return 0;
}
### Prompt

Generate a CPP solution to the following problem:

Example

Input

5


Output

5

### Response

```cpp
#include <vector>
#include <list>
#include <map>
#include <set>
#include <deque>
#include <stack>
#include <bitset>
#include <algorithm>
#include <functional>
#include <numeric>
#include <utility>
#include <sstream>
#include <queue>
#include <iostream>
#include <iomanip>
#include <cstdio>
#include <complex>
#include <cmath>
#include <cstdlib>
#include <cctype>
#include <string>
#include <cstring>
#include <ctime>
#include <fstream>
#include <stdio.h>

using namespace std;

//conversion
//------------------------------------------
inline int toInt(string s) {int v; istringstream sin(s);sin>>v;return v;}
template<class T> inline string toString(T x) {ostringstream sout;sout<<x;return sout.str();}

//typedef
//------------------------------------------
typedef vector<int> VI;
typedef vector<VI> VVI;
typedef vector<double> VEC;
typedef vector<VEC> MAT;
typedef vector<string> VS;
typedef pair<int, int> PII;
typedef pair<int, PII> TIII;
typedef long long LL;
typedef vector<LL> VLL;
typedef vector<VLL> VVLL;
//container util

//------------------------------------------
#define ALL(a)  (a).begin(),(a).end()
#define RALL(a) (a).rbegin(), (a).rend()
#define PB push_back
#define MP make_pair
#define SZ(a) int((a).size())
#define EACH(i,c) for(typeof((c).begin()) i=(c).begin(); i!=(c).end(); ++i)
#define EXIST(s,e) ((s).find(e)!=(s).end())
#define SORT(c) sort((c).begin(),(c).end())
#define MT(a,b,c) MP(a, MP(b, c))
#define T1 first
#define T2 second.first
#define T3 second.second

//repetition
//------------------------------------------
#define FOR(i,a,b) for(int i=(a);i<(b);++i)
#define REP(i,n)  FOR(i,0,n)
#define MOD 1000000007

//AOJ2372
LL fib(int k){//k番目のfibonacci数を求める
	LL a[2][2]={{1,1},{1,0}};
	LL t[2][2];
	LL b[2][2]={{1,0},{0,1}};
	if(k==0)return 1;
	k--;
	while(k){
		if(k&1){
			memset(t,0,sizeof(t));
			REP(p,2)REP(q,2)REP(r,2)t[p][q] += (a[p][r]*b[r][q]) % MOD;
			REP(p,2)REP(q,2)b[p][q]=(t[p][q]%MOD);
		}
		memset(t,0,sizeof(t));
		REP(p,2)REP(q,2)REP(r,2)t[p][q] += (a[p][r]*a[r][q]) % MOD;
		REP(p,2)REP(q,2)a[p][q]=(t[p][q]%MOD);
		k>>=1;
	}
	return (b[0][0]+b[0][1])%MOD;
}

int main(){
	LL u,l,f,g,s,k;
	cin >> k;
	u=2000000000;
	l=0;
	while(u-l>1){
		LL mid=(u+l)/2;
		if(k<=mid*(mid+1))u=mid;
		else l=mid;
	}
	if(k<=u*(u+1))f=u;
	else f=l;
	g=k-f*(f-1);
	if(k<=f*f)s=2*f;
	else{
		g-=f;
		s=2*f+1;
	}
	if(g*2<=f+1)g=2*g-1;
	else{
		g-=(f+1)/2+1;
		g=f-2*g-(f%2);
	}
	cout << (fib(g)*fib(s-g)%MOD) << endl;
	return 0;
}
```