#include #include #include #include #include using namespace std; using mint=atcoder::modint1000000007; #include template T lagrange_interpolation(const vector&y,long long x_) { int N=y.size(); if(N==0)return T(0); if(x_fac(N),invfac(N); fac[0]=1; for(int i=1;iL(N),R(N); T x=x_; L[0]=1; for(int i=1;i>N; vector >inv(1,vector(N,-1)); map,int>mp; mp[inv[0]]=0; vector >E; queueP;P.push(0); while(!P.empty()) { int u=P.front();P.pop(); for(int i=0;i<1<>j&1?j+9:-1; for(int j=0;j=0&&pr[j+9]>=0) { int x=find(j),y=find(j+9); if(x!=y)pr[y]=x; } } for(int j=0;j>j&3)==3) //pr[j+9]>=0&&pr[j+1+9]>=0) { int x=find(j+9),y=find(j+1+9); if(x!=y)pr[y]=x; } } vectornow(N,-1); usdtm++; int id=0; for(int j=0;j>j&1) { int x=find(j+9); if(usd[x]0) { bool ok=true; for(int j=0;j=0) { int x=find(j); if(usd[x]=0) { if(ok==-1)ok=inv[u][j]; else if(ok!=inv[u][j])ok=-2; } if(ok==-2)continue; id=-1; } E.push_back(make_pair(u+1,id+1)); } } E.push_back(make_pair(0,0)); const int n=2188+1; vectorT(n); T[1]=1; vectory(n+5); for(int i=0;inT(n); for(paire:E) { nT[e.second]+=T[e.first]; } T=nT; } long M;cin>>M; cout<