#include typedef uint64_t u64; typedef int64_t i64; using namespace std; template struct modint{ u64 val; modint(i64 val_=0):val((val_%i64(mod)+i64(mod))%i64(mod)){} modint operator-(){ return (val==0)?0:mod-val; } modint operator+(modint rhs){ return modint(*this)+=rhs; } modint operator-(modint rhs){ return modint(*this)-=rhs; } modint operator*(modint rhs){ return modint(*this)*=rhs; } modint operator/(modint rhs){ return modint(*this)/=rhs; } modint pow(i64 rhs){ modint res=1,now=(*this); while(rhs){ res*=((rhs&1)?now:1),now*=now,rhs>>=1; } return res; } modint &operator+=(modint rhs){ val+=rhs.val,val-=((val>=mod)?mod:0); return (*this); } modint &operator-=(modint rhs){ val+=((val>(std::istream& is,modint& x){ u64 t; is>>t,x=t; return is; } }; vector>> t; template vector conv(vector f,vector g){ vector res(f.size()+g.size()-1); for(size_t i=0;i void E(vector& f){ for(int i=0;i<(f.size()+1)/2;++i){ f[i]=f[i*2]; } f.resize((f.size()+1)/2); } template void O(vector& f){ for(int i=0;i vector M(vector f){ for(int i=1;i T bostan_mori(vector f,vector g,i64 k){ if(k<0){ return 0; } int now=0; while(k>0){ auto h=M(g); f=conv(f,h); if(t.size()<=now){ g=conv(g,h); E(g); t.emplace_back(g); now++; } else{ g=t[now]; now++; } if(k%2==0){ E(f); } else{ O(f); } k/=2; } return f[0]; } int main(){ constexpr u64 mod=1000000007; typedef modint mint; vector f={1}; vector g={1,-1,-1}; vector h={1,-2,-1,2,1}; i64 n; cin>>n; if(n%2==0){ cout<