#include<deque>
#include<queue>
#include<vector>
#include<algorithm>
#include<iostream>
#include<set>
#include<cmath>
#include<tuple>
#include<string>
//#include<chrono>
#include<functional>
#include<iterator>
#include<random>
#include<unordered_set>
#include<array>
#include<map>
#include<iomanip>
#include<assert.h>
#include<bitset>
#include<stack>
#include<memory>
using namespace std;
//using namespace std::chrono;
typedef long long int llint;
typedef double lldo;
#define mp make_pair
#define mt make_tuple
#define pub push_back
#define puf push_front
#define pob pop_back
#define pof pop_front
#define fir first
#define sec second
#define res resize
#define ins insert
#define era erase

/*
cout<<fixed<<setprecision(20);
cin.tie(0);
ios::sync_with_stdio(false);
*/
const llint mod=1000000007;
const llint big=2.19e17+1;
const long double pai=3.141592653589793238462643383279502884197;
const long double eps=1e-7;
template <class T,class U>bool mineq(T& a,U b){if(a>b){a=b;return true;}return false;}
template <class T,class U>bool maxeq(T& a,U b){if(a<b){a=b;return true;}return false;}
llint gcd(llint a,llint b){if(a%b==0){return b;}else return gcd(b,a%b);}
llint lcm(llint a,llint b){if(a==0){return b;}return a/gcd(a,b)*b;}
template<class T> void SO(T& ve){sort(ve.begin(),ve.end());}
template<class T> void REV(T& ve){reverse(ve.begin(),ve.end());}
template<class T>llint LBI(vector<T>&ar,T in){return lower_bound(ar.begin(),ar.end(),in)-ar.begin();}
template<class T>llint UBI(vector<T>&ar,T in){return upper_bound(ar.begin(),ar.end(),in)-ar.begin();}

llint fib(llint in){
	in++;
	llint a=0,b=1;//0項め
	for(int h=35;h>=0;h--){
		//*2操作
		llint xa=(a*(b*2-a))%mod;
		llint xb=(b*b+a*a)%mod;
		a=xa;b=xb;
		//+1操作
		if(in&(1LL<<h)){llint c=a+b;a=b;b=c;}
	}
	b%=mod;b+=mod;b%=mod;
	return b;
}
int main(void){
	llint K,i,j;cin>>K;
	llint s=sqrt(K-1)+0.2;
	if(s*s>=K){s--;}
	llint d=s+s-1;
	llint ama=K-s*s;
	if(s*s+s<K){d++;ama=K-s*s-s;}
	ama--;
	llint e=ama*2;
	if(e*2>d){
		if(d%2==1){e=d-e;}
		else{e=d+1-e;}
	}
	//cerr<<"d="<<d<<"e="<<e<<endl;
	cout<<fib(d-e)*fib(e)%mod<<endl;
	/*
	vector<tuple<llint,int,int>>suu;
	for(i=0;i<20;i++){
		for(j=i;i+j<20;j++){
			suu.pub(mt(fib(i)*fib(j),i+j,i));
		}
	}
	SO(suu);
	int aaa=1;
	for(auto it:suu){
		cout<<get<0>(it)<<" "<<get<1>(it)<<" "<<get<2>(it)<<"\t"<<aaa<<endl;
		aaa++;
	}*/
	return 0;
}
/*
0 1 2 3 4 5 6
1 1 2 3 5 8 13

*/

### Prompt

Your task is to create a cpp solution to the following problem:

Example

Input

5


Output

5

### Response

```cpp
#include<deque>
#include<queue>
#include<vector>
#include<algorithm>
#include<iostream>
#include<set>
#include<cmath>
#include<tuple>
#include<string>
//#include<chrono>
#include<functional>
#include<iterator>
#include<random>
#include<unordered_set>
#include<array>
#include<map>
#include<iomanip>
#include<assert.h>
#include<bitset>
#include<stack>
#include<memory>
using namespace std;
//using namespace std::chrono;
typedef long long int llint;
typedef double lldo;
#define mp make_pair
#define mt make_tuple
#define pub push_back
#define puf push_front
#define pob pop_back
#define pof pop_front
#define fir first
#define sec second
#define res resize
#define ins insert
#define era erase

/*
cout<<fixed<<setprecision(20);
cin.tie(0);
ios::sync_with_stdio(false);
*/
const llint mod=1000000007;
const llint big=2.19e17+1;
const long double pai=3.141592653589793238462643383279502884197;
const long double eps=1e-7;
template <class T,class U>bool mineq(T& a,U b){if(a>b){a=b;return true;}return false;}
template <class T,class U>bool maxeq(T& a,U b){if(a<b){a=b;return true;}return false;}
llint gcd(llint a,llint b){if(a%b==0){return b;}else return gcd(b,a%b);}
llint lcm(llint a,llint b){if(a==0){return b;}return a/gcd(a,b)*b;}
template<class T> void SO(T& ve){sort(ve.begin(),ve.end());}
template<class T> void REV(T& ve){reverse(ve.begin(),ve.end());}
template<class T>llint LBI(vector<T>&ar,T in){return lower_bound(ar.begin(),ar.end(),in)-ar.begin();}
template<class T>llint UBI(vector<T>&ar,T in){return upper_bound(ar.begin(),ar.end(),in)-ar.begin();}

llint fib(llint in){
	in++;
	llint a=0,b=1;//0項め
	for(int h=35;h>=0;h--){
		//*2操作
		llint xa=(a*(b*2-a))%mod;
		llint xb=(b*b+a*a)%mod;
		a=xa;b=xb;
		//+1操作
		if(in&(1LL<<h)){llint c=a+b;a=b;b=c;}
	}
	b%=mod;b+=mod;b%=mod;
	return b;
}
int main(void){
	llint K,i,j;cin>>K;
	llint s=sqrt(K-1)+0.2;
	if(s*s>=K){s--;}
	llint d=s+s-1;
	llint ama=K-s*s;
	if(s*s+s<K){d++;ama=K-s*s-s;}
	ama--;
	llint e=ama*2;
	if(e*2>d){
		if(d%2==1){e=d-e;}
		else{e=d+1-e;}
	}
	//cerr<<"d="<<d<<"e="<<e<<endl;
	cout<<fib(d-e)*fib(e)%mod<<endl;
	/*
	vector<tuple<llint,int,int>>suu;
	for(i=0;i<20;i++){
		for(j=i;i+j<20;j++){
			suu.pub(mt(fib(i)*fib(j),i+j,i));
		}
	}
	SO(suu);
	int aaa=1;
	for(auto it:suu){
		cout<<get<0>(it)<<" "<<get<1>(it)<<" "<<get<2>(it)<<"\t"<<aaa<<endl;
		aaa++;
	}*/
	return 0;
}
/*
0 1 2 3 4 5 6
1 1 2 3 5 8 13

*/

```