結果
問題 | No.1500 Super Knight |
ユーザー |
![]() |
提出日時 | 2021-05-07 22:35:27 |
言語 | C++17(gcc12) (gcc 12.3.0 + boost 1.87.0) |
結果 |
AC
|
実行時間 | 215 ms / 2,000 ms |
コード長 | 46,632 bytes |
コンパイル時間 | 25,951 ms |
コンパイル使用メモリ | 362,540 KB |
最終ジャッジ日時 | 2025-01-21 08:28:06 |
ジャッジサーバーID (参考情報) |
judge4 / judge3 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 2 |
other | AC * 33 |
ソースコード
#line 2 "cpplib/util/template.hpp"#pragma GCC optimize("Ofast")#pragma GCC optimize("unroll-loops")#pragma GCC target("avx2")#include<bits/stdc++.h>using namespace std;struct __INIT__{__INIT__(){cin.tie(0);ios::sync_with_stdio(false);cout<<fixed<<setprecision(15);}}__INIT__;typedef long long lint;#define INF (1LL<<60)#define IINF (1<<30)//#define EPS (1e-10)#define endl ('\n')typedef vector<lint> vec;typedef vector<vector<lint>> mat;typedef vector<vector<vector<lint>>> mat3;typedef vector<string> svec;typedef vector<vector<string>> smat;template<typename T>using V=vector<T>;template<typename T>using VV=V<V<T>>;template<typename T>inline void output(T t){bool f=0;for(auto i:t){cout<<(f?" ":"")<<i;f=1;}cout<<endl;}template<typename T>inline void output2(T t){for(auto i:t)output(i);}template<typename T>inline void debug(T t){bool f=0;for(auto i:t){cerr<<(f?" ":"")<<i;f=1;}cerr<<endl;}template<typename T>inline void debug2(T t){for(auto i:t)debug(i);}#define loop(n) for(long long _=0;_<(long long)(n);++_)#define _overload4(_1,_2,_3,_4,name,...) name#define __rep(i,a) repi(i,0,a,1)#define _rep(i,a,b) repi(i,a,b,1)#define repi(i,a,b,c) for(long long i=(long long)(a);i<(long long)(b);i+=c)#define rep(...) _overload4(__VA_ARGS__,repi,_rep,__rep)(__VA_ARGS__)#define _overload3_rev(_1,_2,_3,name,...) name#define _rep_rev(i,a) repi_rev(i,0,a)#define repi_rev(i,a,b) for(long long i=(long long)(b)-1;i>=(long long)(a);--i)#define rrep(...) _overload3_rev(__VA_ARGS__,repi_rev,_rep_rev)(__VA_ARGS__)// #define rep(i,...) for(auto i:range(__VA_ARGS__))// #define rrep(i,...) for(auto i:reversed(range(__VA_ARGS__)))// #define repi(i,a,b) for(lint i=lint(a);i<(lint)(b);++i)// #define rrepi(i,a,b) for(lint i=lint(b)-1;i>=lint(a);--i)// #define irep(i) for(lint i=0;;++i)// inline vector<long long> range(long long n){if(n<=0)return vector<long long>();vector<long long>v(n);iota(v.begin(),v.end(),0LL);return v;}// inline vector<long long> range(long long a,long long b){if(b<=a)return vector<long long>();vector<long long>v(b-a);iota(v.begin(),v.end(),a);return v;}// inline vector<long long> range(long long a,long long b,long long c){if((b-a+c-1)/c<=0)return vector<long long>();vector<long long>v((b-a+c-1)/c);for(int i=0;i<(int)v.size();++i)v[i]=i?v[i-1]+c:a;return v;}// template<typename T>inline T reversed(T v){reverse(v.begin(),v.end());return v;}#define all(n) begin(n),end(n)template<typename T,typename E>bool chmin(T& s,const E& t){bool res=s>t;s=min<T>(s,t);return res;}template<typename T,typename E>bool chmax(T& s,const E& t){bool res=s<t;s=max<T>(s,t);return res;}const vector<lint> dx={1,0,-1,0,1,1,-1,-1};const vector<lint> dy={0,1,0,-1,1,-1,1,-1};#define SUM(v) accumulate(all(v),0LL)template<typename T,typename ...Args>auto make_vector(T x,int arg,Args ...args){if constexpr(sizeof...(args)==0)return vector<T>(arg,x);else returnvector(arg,make_vector<T>(x,args...));}#define extrep(v,...) for(auto v:__MAKE_MAT__({__VA_ARGS__}))#define bit(n,a) ((n>>a)&1)vector<vector<long long>> __MAKE_MAT__(vector<long long> v){if(v.empty())return vector<vector<long long>>(1,vector<long long>());long long n=v.back();v.pop_back();vector<vector<long long>> ret;vector<vector<long long>> tmp=__MAKE_MAT__(v);for(auto e:tmp)for(long long i=0;i<n;++i){ret.push_back(e);ret.back().push_back(i);}return ret;}using graph=vector<vector<int>>;template<typename T>using graph_w=vector<vector<pair<int,T>>>;template<typename T,typename E>ostream& operator<<(ostream& out,pair<T,E>v){out<<"("<<v.first<<","<<v.second<<")";return out;}constexpr inline long long powll(long long a,long long b){long long res=1;while(b--)res*=a;return res;}#line 6 "cpplib/math/FPS_base.hpp"#include<type_traits>#line 8 "cpplib/math/FPS_base.hpp"/*** @brief 形式的冪級数(BASE)*/template<typename T,typename F>struct FPS_BASE:std::vector<T>{using std::vector<T>::vector;using P=FPS_BASE<T,F>;F fft;FPS_BASE(){}inline P operator +(T x)const noexcept{return P(*this)+=x;}inline P operator -(T x)const noexcept{return P(*this)-=x;}inline P operator *(T x)const noexcept{return P(*this)*=x;}inline P operator /(T x)const noexcept{return P(*this)/=x;}inline P operator <<(int x)noexcept{return P(*this)<<=x;}inline P operator >>(int x)noexcept{return P(*this)>>=x;}inline P operator +(const P& x)const noexcept{return P(*this)+=x;}inline P operator -(const P& x)const noexcept{return P(*this)-=x;}inline P operator -()const noexcept{return P(1,T(0))-=P(*this);}inline P operator *(const P& x)const noexcept{return P(*this)*=x;}inline P operator /(const P& x)const noexcept{return P(*this)/=x;}inline P operator %(const P& x)const noexcept{return P(*this)%=x;}bool operator ==(P x){for(int i=0;i<(int)max((*this).size(),x.size());++i){if(i>=(int)(*this).size()&&x[i]!=T())return 0;if(i>=(int)x.size()&&(*this)[i]!=T())return 0;if(i<(int)min((*this).size(),x.size()))if((*this)[i]!=x[i])return 0;}return 1;}P &operator +=(T x){if(this->size()==0)this->resize(1,T(0));(*this)[0]+=x;return (*this);}P &operator -=(T x){if(this->size()==0)this->resize(1,T(0));(*this)[0]-=x;return (*this);}P &operator *=(T x){for(int i=0;i<(int)this->size();++i){(*this)[i]*=x;}return (*this);}P &operator /=(T x){if(std::is_same<T,long long>::value){for(int i=0;i<(int)this->size();++i){(*this)[i]/=x;}return (*this);}return (*this)*=(T(1)/x);}P &operator <<=(int x){P ret(x,T(0));ret.insert(ret.end(),begin(*this),end(*this));return (*this)=ret;}P &operator >>=(int x){if((int)(*this).size()<=x)return (*this)=P();P ret;ret.insert(ret.end(),begin(*this)+x,end(*this));return (*this)=ret;}P &operator +=(const P& x){if(this->size()<x.size())this->resize(x.size(),T(0));for(int i=0;i<(int)x.size();++i){(*this)[i]+=x[i];}return (*this);}P &operator -=(const P& x){if(this->size()<x.size())this->resize(x.size(),T(0));for(int i=0;i<(int)x.size();++i){(*this)[i]-=x[i];}return (*this);}P &operator *=(const P& x){return (*this)=F()(*this,x);}P &operator /=(P x){if(this->size()<x.size()) {this->clear();return (*this);}const int n=this->size()-x.size()+1;return (*this) = (rev().pre(n)*x.rev().inv(n)).pre(n).rev(n);}P &operator %=(const P& x){return ((*this)-=(*this)/x*x);}inline void print(){for(int i=0;i<(int)(*this).size();++i)std::cerr<<(*this)[i]<<" \n"[i==(int)(*this).size()-1];if((int)(*this).size()==0)std::cerr<<'\n';}inline P& shrink(){while((*this).back()==0)(*this).pop_back();return (*this);}inline P pre(int sz)const{return P(begin(*this),begin(*this)+std::min((int)this->size(),sz));}P rev(int deg=-1){P ret(*this);if(deg!=-1)ret.resize(deg,T(0));reverse(begin(ret),end(ret));return ret;}P inv(int deg=-1){assert((*this)[0]!=T(0));const int n=deg==-1?this->size():deg;P ret({T(1)/(*this)[0]});for(int i=1;i<n;i<<=1){ret*=(-ret*pre(i<<1)+2).pre(i<<1);}return ret.pre(n);}inline P dot(const P& x){P ret(*this);for(int i=0;i<int(min(this->size(),x.size()));++i){ret[i]*=x[i];}return ret;}P diff(){if((int)(*this).size()<=1)return P();P ret(*this);for(int i=0;i<(int)ret.size();i++){ret[i]*=i;}return ret>>1;}P integral(){P ret(*this);for(int i=0;i<(int)ret.size();i++){ret[i]/=i+1;}return ret<<1;}P log(int deg=-1){assert((*this)[0]==T(1));const int n=deg==-1?this->size():deg;return (diff()*inv(n)).pre(n-1).integral();}P exp(int deg=-1){assert((*this)[0]==T(0));const int n=deg==-1?this->size():deg;P ret({T(1)});for(int i=1;i<n;i<<=1){ret=ret*(pre(i<<1)+1-ret.log(i<<1)).pre(i<<1);}return ret.pre(n);}P pow(int c,int deg=-1){const int n=deg==-1?this->size():deg;long long i=0;P ret(*static_cast<P*>(this));while(i!=(int)this->size()&&ret[i]==0)i++;if(i==(int)this->size())return P(n,0);if(i*c>=n)return P(n,0);T k=ret[i];return ((((ret>>i)/k).log(n)*c).exp(n)*(k.pow(c))<<(i*c)).pre(n);// const int n=deg==-1?this->size():deg;// long long i=0;// P ret(*this);// while(i!=(int)this->size()&&ret[i]==0)i++;// if(i==(int)this->size())return P(n,0);// if(i*c>=n)return P(n,0);// T k=ret[i];// return ((((ret>>i)/k).log()*c).exp()*(k.pow(c))<<(i*c)).pre(n);// P x(*this);// P ret(1,1);// while(c) {// if(c&1){// ret*=x;// if(~deg)ret=ret.pre(deg);// }// x*=x;// if(~deg)x=x.pre(deg);// c>>=1;// }// return ret;}P sqrt(int deg=-1){const int n=deg==-1?this->size():deg;if((*this)[0]==T(0)) {for(int i=1;i<(int)this->size();i++) {if((*this)[i]!=T(0)) {if(i&1)return{};if(n-i/2<=0)break;auto ret=(*this>>i).sqrt(n-i/2)<<(i/2);if((int)ret.size()<n)ret.resize(n,T(0));return ret;}}return P(n,0);}P ret({T(1)});for(int i=1;i<n;i<<=1){ret=(ret+pre(i<<1)*ret.inv(i<<1)).pre(i<<1)/T(2);}return ret.pre(n);}P shift(int c){const int n=this->size();P f(*this),g(n,0);for(int i=0;i<n;++i)f[i]*=F().fact(T(i));for(int i=0;i<n;++i)g[i]=F().pow(T(c),i)/F().fact(T(i));g=g.rev();f*=g;f>>=n-1;for(int i=0;i<n;++i)f[i]/=F().fact(T(i));return f;}T eval(T x){T res=0;for(int i=(int)this->size()-1;i>=0;--i){res*=x;res+=(*this)[i];}return res;}P mul(const std::vector<std::pair<int,T>>& x){int mx=0;for(auto [s,t]:x){if(mx<s)mx=s;}P res((int)this->size()+mx);for(int i=0;i<(int)this->size();++i){for(auto [s,t]:x){res[i+s]+=(*this)[i]*t;}}return res;}P div(const std::vector<std::pair<int,T>>& x){P res(*this);T cnt=0;for(auto [s,t]:x){if(s==0)cnt+=t;}cnt=cnt.inv();for(int i=0;i<(int)this->size();++i){for(auto [s,t]:x){if(s==0)continue;if(i>=s)res[i]-=res[i-s]*t*cnt;}}res*=cnt;return res;}static P interpolation(const std::vector<T>&x,const std::vector<T>& y){const int n=x.size();std::vector<std::pair<P,P>>a(n*2-1);std::vector<P> b(n*2-1);for(int i=0;i<n;++i)a[i+n-1]=std::make_pair(P{1},P{T()-x[i],1});for(int i=n-2;i>=0;--i)a[i]={a[2*i+1].first*a[2*i+2].second+a[2*i+2].first*a[2*i+1].second,a[2*i+1].second*a[2*i+2].second};auto d=(a[0].first).multipoint_eval(x);for(int i=0;i<n;++i)b[i+n-1]=P{T(y[i]/d[i])};for(int i=n-2;i>=0;--i)b[i]=b[2*i+1]*a[2*i+2].second+b[2*i+2]*a[2*i+1].second;return b[0];}static P interpolation(const std::vector<T>& y){const int n=y.size();std::vector<std::pair<P,P>>a(n*2-1);std::vector<P>b(n*2-1);for(int i=0;i<n;++i)a[i+n-1]=std::make_pair(P{1},P{T()-i,1});for(int i=n-2;i>=0;--i)a[i]={a[2*i+1].first*a[2*i+2].second+a[2*i+2].first*a[2*i+1].second,a[2*i+1].second*a[2*i+2].second};for(int i=0;i<n;++i){T tmp=F().fact(T(i))*F().pow(T(-1),i)*F().fact(T(n-1-i));b[i+n-1]=P{T(y[i]/tmp)};}for(int i=n-2;i>=0;--i)b[i]=b[2*i+1]*a[2*i+2].second+b[2*i+2]*a[2*i+1].second;return b[0];}std::vector<T> multipoint_eval(const std::vector<T>&x){const int n=x.size();P* v=new P[2*n-1];for(int i=0;i<n;i++)v[i+n-1]={T()-x[i],T(1)};for(int i=n-2;i>=0;i--){v[i]=v[i*2+1]*v[i*2+2];}v[0]=P(*this)%v[0];v[0].shrink();for(int i=1;i<n*2-1;i++){v[i]=v[(i-1)/2]%v[i];v[i].shrink();}std::vector<T>res(n);for(int i=0;i<n;i++)res[i]=v[i+n-1][0];return res;}P slice(int s,int e,int k){P res;for(int i=s;i<e;i+=k)res.push_back((*this)[i]);return res;}T nth_term(P q,int64_t x){if(x==0)return (*this)[0]/q[0];P p(*this);P q2=q;for(int i=1;i<(int)q2.size();i+=2)q2[i]*=-1;q*=q2;p*=q2;return p.slice(x%2,p.size(),2).nth_term(q.slice(0,q.size(),2),x/2);}T guess(int64_t x){auto p=find_linear_recurrence();auto q=p*P(*this);q.resize(this->size());return q.nth_term(p,x);}P gcd(P q){return *this==P()?q:(q%(*this).shrink()).gcd(*this);}//(*this)(t(x))P manipulate(P t,int deg){P s=P(*this);if(deg==0)return P();if((int)t.size()==1)return P{s.eval(t[0])};int k=std::min((int)::sqrt(deg/(::log2(deg)+1))+1,(int)t.size());int b=deg/k+1;P t2=t.pre(k);std::vector<P>table(s.size()/2+1,P{1});for(int i=1;i<(int)table.size();i++){table[i]=((table[i-1])*t2).pre(deg);}auto f=[&](auto f,auto l,auto r,int deg)->P{if(r-l==1)return P{*l};auto m=l+(r-l)/2;return f(f,l,m,deg)+(table[m-l]*f(f,m,r,deg)).pre(deg);};P ans=P();P tmp=f(f,s.begin(),s.end(),deg);P tmp2=P{1};T tmp3=T(1);int tmp5=-1;P tmp6=t2.diff();if(tmp6==P()){for(int i=0;i<b;++i){if(tmp.size()==0)break;ans+=(tmp2*tmp[0]).pre(deg)/tmp3;tmp=tmp.diff();tmp2=(tmp2*(t-t2)).pre(deg);tmp3*=T(i+1);}}else{while(t2[++tmp5]==T());P tmp4=(tmp6>>(tmp5-1)).inv(deg);for(int i=0;i<b;++i){ans+=(tmp*tmp2).pre(deg)/tmp3;tmp=((tmp.diff()>>(tmp5-1))*tmp4).pre(deg);tmp2=(tmp2*(t-t2)).pre(deg);tmp3*=T(i+1);}}return ans;}//(*this)(t(x))P manipulate2(P t,int deg){P ans=P();P s=(*this).rev();for(int i=0;i<(int)s.size();++i){ans=(ans*t+s[i]).pre(deg);}return ans;}P find_linear_recurrence()const{const int n=this->size();P b={T(-1)},c={T(-1)};T y=T(1);for(int i=1;i<=n;++i){int l=c.size(),m=b.size();T x=0;for(int j=0;j<l;++j)x+=c[j]*(*this)[i-l+j];b.emplace_back(0);m++;if(x==T(0))continue;T freq=x/y;if(l<m){auto tmp=c;c<<=m-l;c-=b*freq;b=tmp;y=x;}else{c-=(b*freq)<<(l-m);}}return c.rev().shrink().rev();}static P stirling_second(int n){P a(n+1,0),b(n+1,0);for(int i=0;i<=n;++i){a[i]=F().pow(T(i),n)/F().fact(T(i));b[i]=(i%2?T(-1):T(1))/F().fact(T(i));}return (a*b).pre(n+1);}void debug(){for(int i=0;i<(int)(*this).size();++i)std::cerr<<(*this)[i]<<" \n"[i==(int)(*this).size()-1];}};#line 3 "cpplib/math/FPS_mint.hpp"#include <algorithm>#include <array>#ifdef _MSC_VER#include <intrin.h>#endifnamespace atcoder {namespace internal {// @param n `0 <= n`// @return minimum non-negative `x` s.t. `n <= 2**x`int ceil_pow2(int n) {int x = 0;while ((1U << x) < (unsigned int)(n)) x++;return x;}// @param n `1 <= n`// @return minimum non-negative `x` s.t. `(n & (1 << x)) != 0`int bsf(unsigned int n) {#ifdef _MSC_VERunsigned long index;_BitScanForward(&index, n);return index;#elsereturn __builtin_ctz(n);#endif}} // namespace internal} // namespace atcoder#include <utility>#ifdef _MSC_VER#include <intrin.h>#endifnamespace atcoder {namespace internal {// @param m `1 <= m`// @return x mod mconstexpr long long safe_mod(long long x, long long m) {x %= m;if (x < 0) x += m;return x;}// Fast modular multiplication by barrett reduction// Reference: https://en.wikipedia.org/wiki/Barrett_reduction// NOTE: reconsider after Ice Lakestruct barrett {unsigned int _m;unsigned long long im;// @param m `1 <= m < 2^31`barrett(unsigned int m) : _m(m), im((unsigned long long)(-1) / m + 1) {}// @return munsigned int umod() const { return _m; }// @param a `0 <= a < m`// @param b `0 <= b < m`// @return `a * b % m`unsigned int mul(unsigned int a, unsigned int b) const {// [1] m = 1// a = b = im = 0, so okay// [2] m >= 2// im = ceil(2^64 / m)// -> im * m = 2^64 + r (0 <= r < m)// let z = a*b = c*m + d (0 <= c, d < m)// a*b * im = (c*m + d) * im = c*(im*m) + d*im = c*2^64 + c*r + d*im// c*r + d*im < m * m + m * im < m * m + 2^64 + m <= 2^64 + m * (m + 1) < 2^64 * 2// ((ab * im) >> 64) == c or c + 1unsigned long long z = a;z *= b;#ifdef _MSC_VERunsigned long long x;_umul128(z, im, &x);#elseunsigned long long x =(unsigned long long)(((unsigned __int128)(z)*im) >> 64);#endifunsigned int v = (unsigned int)(z - x * _m);if (_m <= v) v += _m;return v;}};// @param n `0 <= n`// @param m `1 <= m`// @return `(x ** n) % m`constexpr long long pow_mod_constexpr(long long x, long long n, int m) {if (m == 1) return 0;unsigned int _m = (unsigned int)(m);unsigned long long r = 1;unsigned long long y = safe_mod(x, m);while (n) {if (n & 1) r = (r * y) % _m;y = (y * y) % _m;n >>= 1;}return r;}// Reference:// M. Forisek and J. Jancina,// Fast Primality Testing for Integers That Fit into a Machine Word// @param n `0 <= n`constexpr bool is_prime_constexpr(int n) {if (n <= 1) return false;if (n == 2 || n == 7 || n == 61) return true;if (n % 2 == 0) return false;long long d = n - 1;while (d % 2 == 0) d /= 2;constexpr long long bases[3] = {2, 7, 61};for (long long a : bases) {long long t = d;long long y = pow_mod_constexpr(a, t, n);while (t != n - 1 && y != 1 && y != n - 1) {y = y * y % n;t <<= 1;}if (y != n - 1 && t % 2 == 0) {return false;}}return true;}template <int n> constexpr bool is_prime = is_prime_constexpr(n);// @param b `1 <= b`// @return pair(g, x) s.t. g = gcd(a, b), xa = g (mod b), 0 <= x < b/gconstexpr std::pair<long long, long long> inv_gcd(long long a, long long b) {a = safe_mod(a, b);if (a == 0) return {b, 0};// Contracts:// [1] s - m0 * a = 0 (mod b)// [2] t - m1 * a = 0 (mod b)// [3] s * |m1| + t * |m0| <= blong long s = b, t = a;long long m0 = 0, m1 = 1;while (t) {long long u = s / t;s -= t * u;m0 -= m1 * u; // |m1 * u| <= |m1| * s <= b// [3]:// (s - t * u) * |m1| + t * |m0 - m1 * u|// <= s * |m1| - t * u * |m1| + t * (|m0| + |m1| * u)// = s * |m1| + t * |m0| <= bauto tmp = s;s = t;t = tmp;tmp = m0;m0 = m1;m1 = tmp;}// by [3]: |m0| <= b/g// by g != b: |m0| < b/gif (m0 < 0) m0 += b / s;return {s, m0};}// Compile time primitive root// @param m must be prime// @return primitive root (and minimum in now)constexpr int primitive_root_constexpr(int m) {if (m == 2) return 1;if (m == 167772161) return 3;if (m == 469762049) return 3;if (m == 754974721) return 11;if (m == 998244353) return 3;int divs[20] = {};divs[0] = 2;int cnt = 1;int x = (m - 1) / 2;while (x % 2 == 0) x /= 2;for (int i = 3; (long long)(i)*i <= x; i += 2) {if (x % i == 0) {divs[cnt++] = i;while (x % i == 0) {x /= i;}}}if (x > 1) {divs[cnt++] = x;}for (int g = 2;; g++) {bool ok = true;for (int i = 0; i < cnt; i++) {if (pow_mod_constexpr(g, (m - 1) / divs[i], m) == 1) {ok = false;break;}}if (ok) return g;}}template <int m> constexpr int primitive_root = primitive_root_constexpr(m);} // namespace internal} // namespace atcoder#include <cassert>#include <numeric>#include <type_traits>namespace atcoder {namespace internal {#ifndef _MSC_VERtemplate <class T>using is_signed_int128 =typename std::conditional<std::is_same<T, __int128_t>::value ||std::is_same<T, __int128>::value,std::true_type,std::false_type>::type;template <class T>using is_unsigned_int128 =typename std::conditional<std::is_same<T, __uint128_t>::value ||std::is_same<T, unsigned __int128>::value,std::true_type,std::false_type>::type;template <class T>using make_unsigned_int128 =typename std::conditional<std::is_same<T, __int128_t>::value,__uint128_t,unsigned __int128>;template <class T>using is_integral = typename std::conditional<std::is_integral<T>::value ||is_signed_int128<T>::value ||is_unsigned_int128<T>::value,std::true_type,std::false_type>::type;template <class T>using is_signed_int = typename std::conditional<(is_integral<T>::value &&std::is_signed<T>::value) ||is_signed_int128<T>::value,std::true_type,std::false_type>::type;template <class T>using is_unsigned_int =typename std::conditional<(is_integral<T>::value &&std::is_unsigned<T>::value) ||is_unsigned_int128<T>::value,std::true_type,std::false_type>::type;template <class T>using to_unsigned = typename std::conditional<is_signed_int128<T>::value,make_unsigned_int128<T>,typename std::conditional<std::is_signed<T>::value,std::make_unsigned<T>,std::common_type<T>>::type>::type;#elsetemplate <class T> using is_integral = typename std::is_integral<T>;template <class T>using is_signed_int =typename std::conditional<is_integral<T>::value && std::is_signed<T>::value,std::true_type,std::false_type>::type;template <class T>using is_unsigned_int =typename std::conditional<is_integral<T>::value &&std::is_unsigned<T>::value,std::true_type,std::false_type>::type;template <class T>using to_unsigned = typename std::conditional<is_signed_int<T>::value,std::make_unsigned<T>,std::common_type<T>>::type;#endiftemplate <class T>using is_signed_int_t = std::enable_if_t<is_signed_int<T>::value>;template <class T>using is_unsigned_int_t = std::enable_if_t<is_unsigned_int<T>::value>;template <class T> using to_unsigned_t = typename to_unsigned<T>::type;} // namespace internal} // namespace atcoder#include <cassert>#include <numeric>#include <type_traits>#ifdef _MSC_VER#include <intrin.h>#endifnamespace atcoder {namespace internal {struct modint_base {};struct static_modint_base : modint_base {};template <class T> using is_modint = std::is_base_of<modint_base, T>;template <class T> using is_modint_t = std::enable_if_t<is_modint<T>::value>;} // namespace internaltemplate <int m, std::enable_if_t<(1 <= m)>* = nullptr>struct static_modint : internal::static_modint_base {using mint = static_modint;public:static constexpr int mod() { return m; }static mint raw(int v) {mint x;x._v = v;return x;}static_modint() : _v(0) {}template <class T, internal::is_signed_int_t<T>* = nullptr>static_modint(T v) {long long x = (long long)(v % (long long)(umod()));if (x < 0) x += umod();_v = (unsigned int)(x);}template <class T, internal::is_unsigned_int_t<T>* = nullptr>static_modint(T v) {_v = (unsigned int)(v % umod());}static_modint(bool v) { _v = ((unsigned int)(v) % umod()); }unsigned int val() const { return _v; }mint& operator++() {_v++;if (_v == umod()) _v = 0;return *this;}mint& operator--() {if (_v == 0) _v = umod();_v--;return *this;}mint operator++(int) {mint result = *this;++*this;return result;}mint operator--(int) {mint result = *this;--*this;return result;}mint& operator+=(const mint& rhs) {_v += rhs._v;if (_v >= umod()) _v -= umod();return *this;}mint& operator-=(const mint& rhs) {_v -= rhs._v;if (_v >= umod()) _v += umod();return *this;}mint& operator*=(const mint& rhs) {unsigned long long z = _v;z *= rhs._v;_v = (unsigned int)(z % umod());return *this;}mint& operator/=(const mint& rhs) { return *this = *this * rhs.inv(); }mint operator+() const { return *this; }mint operator-() const { return mint() - *this; }mint pow(long long n) const {assert(0 <= n);mint x = *this, r = 1;while (n) {if (n & 1) r *= x;x *= x;n >>= 1;}return r;}mint inv() const {if (prime) {assert(_v);return pow(umod() - 2);} else {auto eg = internal::inv_gcd(_v, m);assert(eg.first == 1);return eg.second;}}friend mint operator+(const mint& lhs, const mint& rhs) {return mint(lhs) += rhs;}friend mint operator-(const mint& lhs, const mint& rhs) {return mint(lhs) -= rhs;}friend mint operator*(const mint& lhs, const mint& rhs) {return mint(lhs) *= rhs;}friend mint operator/(const mint& lhs, const mint& rhs) {return mint(lhs) /= rhs;}friend bool operator==(const mint& lhs, const mint& rhs) {return lhs._v == rhs._v;}friend bool operator!=(const mint& lhs, const mint& rhs) {return lhs._v != rhs._v;}private:unsigned int _v;static constexpr unsigned int umod() { return m; }static constexpr bool prime = internal::is_prime<m>;};template <int id> struct dynamic_modint : internal::modint_base {using mint = dynamic_modint;public:static int mod() { return (int)(bt.umod()); }static void set_mod(int m) {assert(1 <= m);bt = internal::barrett(m);}static mint raw(int v) {mint x;x._v = v;return x;}dynamic_modint() : _v(0) {}template <class T, internal::is_signed_int_t<T>* = nullptr>dynamic_modint(T v) {long long x = (long long)(v % (long long)(mod()));if (x < 0) x += mod();_v = (unsigned int)(x);}template <class T, internal::is_unsigned_int_t<T>* = nullptr>dynamic_modint(T v) {_v = (unsigned int)(v % mod());}dynamic_modint(bool v) { _v = ((unsigned int)(v) % mod()); }unsigned int val() const { return _v; }mint& operator++() {_v++;if (_v == umod()) _v = 0;return *this;}mint& operator--() {if (_v == 0) _v = umod();_v--;return *this;}mint operator++(int) {mint result = *this;++*this;return result;}mint operator--(int) {mint result = *this;--*this;return result;}mint& operator+=(const mint& rhs) {_v += rhs._v;if (_v >= umod()) _v -= umod();return *this;}mint& operator-=(const mint& rhs) {_v += mod() - rhs._v;if (_v >= umod()) _v -= umod();return *this;}mint& operator*=(const mint& rhs) {_v = bt.mul(_v, rhs._v);return *this;}mint& operator/=(const mint& rhs) { return *this = *this * rhs.inv(); }mint operator+() const { return *this; }mint operator-() const { return mint() - *this; }mint pow(long long n) const {assert(0 <= n);mint x = *this, r = 1;while (n) {if (n & 1) r *= x;x *= x;n >>= 1;}return r;}mint inv() const {auto eg = internal::inv_gcd(_v, mod());assert(eg.first == 1);return eg.second;}friend mint operator+(const mint& lhs, const mint& rhs) {return mint(lhs) += rhs;}friend mint operator-(const mint& lhs, const mint& rhs) {return mint(lhs) -= rhs;}friend mint operator*(const mint& lhs, const mint& rhs) {return mint(lhs) *= rhs;}friend mint operator/(const mint& lhs, const mint& rhs) {return mint(lhs) /= rhs;}friend bool operator==(const mint& lhs, const mint& rhs) {return lhs._v == rhs._v;}friend bool operator!=(const mint& lhs, const mint& rhs) {return lhs._v != rhs._v;}private:unsigned int _v;static internal::barrett bt;static unsigned int umod() { return bt.umod(); }};template <int id> internal::barrett dynamic_modint<id>::bt = 998244353;using modint998244353 = static_modint<998244353>;using modint1000000007 = static_modint<1000000007>;using modint = dynamic_modint<-1>;namespace internal {template <class T>using is_static_modint = std::is_base_of<internal::static_modint_base, T>;template <class T>using is_static_modint_t = std::enable_if_t<is_static_modint<T>::value>;template <class> struct is_dynamic_modint : public std::false_type {};template <int id>struct is_dynamic_modint<dynamic_modint<id>> : public std::true_type {};template <class T>using is_dynamic_modint_t = std::enable_if_t<is_dynamic_modint<T>::value>;} // namespace internal} // namespace atcoder#include <cassert>#include <type_traits>#include <vector>namespace atcoder {namespace internal {template <class mint, internal::is_static_modint_t<mint>* = nullptr>void butterfly(std::vector<mint>& a) {static constexpr int g = internal::primitive_root<mint::mod()>;int n = int(a.size());int h = internal::ceil_pow2(n);static bool first = true;static mint sum_e[30]; // sum_e[i] = ies[0] * ... * ies[i - 1] * es[i]if (first) {first = false;mint es[30], ies[30]; // es[i]^(2^(2+i)) == 1int cnt2 = bsf(mint::mod() - 1);mint e = mint(g).pow((mint::mod() - 1) >> cnt2), ie = e.inv();for (int i = cnt2; i >= 2; i--) {// e^(2^i) == 1es[i - 2] = e;ies[i - 2] = ie;e *= e;ie *= ie;}mint now = 1;for (int i = 0; i <= cnt2 - 2; i++) {sum_e[i] = es[i] * now;now *= ies[i];}}for (int ph = 1; ph <= h; ph++) {int w = 1 << (ph - 1), p = 1 << (h - ph);mint now = 1;for (int s = 0; s < w; s++) {int offset = s << (h - ph + 1);for (int i = 0; i < p; i++) {auto l = a[i + offset];auto r = a[i + offset + p] * now;a[i + offset] = l + r;a[i + offset + p] = l - r;}now *= sum_e[bsf(~(unsigned int)(s))];}}}template <class mint, internal::is_static_modint_t<mint>* = nullptr>void butterfly_inv(std::vector<mint>& a) {static constexpr int g = internal::primitive_root<mint::mod()>;int n = int(a.size());int h = internal::ceil_pow2(n);static bool first = true;static mint sum_ie[30]; // sum_ie[i] = es[0] * ... * es[i - 1] * ies[i]if (first) {first = false;mint es[30], ies[30]; // es[i]^(2^(2+i)) == 1int cnt2 = bsf(mint::mod() - 1);mint e = mint(g).pow((mint::mod() - 1) >> cnt2), ie = e.inv();for (int i = cnt2; i >= 2; i--) {// e^(2^i) == 1es[i - 2] = e;ies[i - 2] = ie;e *= e;ie *= ie;}mint now = 1;for (int i = 0; i <= cnt2 - 2; i++) {sum_ie[i] = ies[i] * now;now *= es[i];}}for (int ph = h; ph >= 1; ph--) {int w = 1 << (ph - 1), p = 1 << (h - ph);mint inow = 1;for (int s = 0; s < w; s++) {int offset = s << (h - ph + 1);for (int i = 0; i < p; i++) {auto l = a[i + offset];auto r = a[i + offset + p];a[i + offset] = l + r;a[i + offset + p] =(unsigned long long)(mint::mod() + l.val() - r.val()) *inow.val();}inow *= sum_ie[bsf(~(unsigned int)(s))];}}}} // namespace internaltemplate <class mint, internal::is_static_modint_t<mint>* = nullptr>std::vector<mint> convolution(std::vector<mint> a, std::vector<mint> b) {int n = int(a.size()), m = int(b.size());if (!n || !m) return {};if (std::min(n, m) <= 60) {if (n < m) {std::swap(n, m);std::swap(a, b);}std::vector<mint> ans(n + m - 1);for (int i = 0; i < n; i++) {for (int j = 0; j < m; j++) {ans[i + j] += a[i] * b[j];}}return ans;}int z = 1 << internal::ceil_pow2(n + m - 1);a.resize(z);internal::butterfly(a);b.resize(z);internal::butterfly(b);for (int i = 0; i < z; i++) {a[i] *= b[i];}internal::butterfly_inv(a);a.resize(n + m - 1);mint iz = mint(z).inv();for (int i = 0; i < n + m - 1; i++) a[i] *= iz;return a;}template <unsigned int mod = 998244353,class T,std::enable_if_t<internal::is_integral<T>::value>* = nullptr>std::vector<T> convolution(const std::vector<T>& a, const std::vector<T>& b) {int n = int(a.size()), m = int(b.size());if (!n || !m) return {};using mint = static_modint<mod>;std::vector<mint> a2(n), b2(m);for (int i = 0; i < n; i++) {a2[i] = mint(a[i]);}for (int i = 0; i < m; i++) {b2[i] = mint(b[i]);}auto c2 = convolution(move(a2), move(b2));std::vector<T> c(n + m - 1);for (int i = 0; i < n + m - 1; i++) {c[i] = c2[i].val();}return c;}std::vector<long long> convolution_ll(const std::vector<long long>& a,const std::vector<long long>& b) {int n = int(a.size()), m = int(b.size());if (!n || !m) return {};static constexpr unsigned long long MOD1 = 754974721; // 2^24static constexpr unsigned long long MOD2 = 167772161; // 2^25static constexpr unsigned long long MOD3 = 469762049; // 2^26static constexpr unsigned long long M2M3 = MOD2 * MOD3;static constexpr unsigned long long M1M3 = MOD1 * MOD3;static constexpr unsigned long long M1M2 = MOD1 * MOD2;static constexpr unsigned long long M1M2M3 = MOD1 * MOD2 * MOD3;static constexpr unsigned long long i1 =internal::inv_gcd(MOD2 * MOD3, MOD1).second;static constexpr unsigned long long i2 =internal::inv_gcd(MOD1 * MOD3, MOD2).second;static constexpr unsigned long long i3 =internal::inv_gcd(MOD1 * MOD2, MOD3).second;auto c1 = convolution<MOD1>(a, b);auto c2 = convolution<MOD2>(a, b);auto c3 = convolution<MOD3>(a, b);std::vector<long long> c(n + m - 1);for (int i = 0; i < n + m - 1; i++) {unsigned long long x = 0;x += (c1[i] * i1) % MOD1 * M2M3;x += (c2[i] * i2) % MOD2 * M1M3;x += (c3[i] * i3) % MOD3 * M1M2;// B = 2^63, -B <= x, r(real value) < B// (x, x - M, x - 2M, or x - 3M) = r (mod 2B)// r = c1[i] (mod MOD1)// focus on MOD1// r = x, x - M', x - 2M', x - 3M' (M' = M % 2^64) (mod 2B)// r = x,// x - M' + (0 or 2B),// x - 2M' + (0, 2B or 4B),// x - 3M' + (0, 2B, 4B or 6B) (without mod!)// (r - x) = 0, (0)// - M' + (0 or 2B), (1)// -2M' + (0 or 2B or 4B), (2)// -3M' + (0 or 2B or 4B or 6B) (3) (mod MOD1)// we checked that// ((1) mod MOD1) mod 5 = 2// ((2) mod MOD1) mod 5 = 3// ((3) mod MOD1) mod 5 = 4long long diff =c1[i] - internal::safe_mod((long long)(x), (long long)(MOD1));if (diff < 0) diff += MOD1;static constexpr unsigned long long offset[5] = {0, 0, M1M2M3, 2 * M1M2M3, 3 * M1M2M3};x -= offset[diff % 5];c[i] = x;}return c;}} // namespace atcoder#line 1 "cpplib/math/ceil_pow2.hpp"int ceil_pow2(int n) {int x = 0;while ((1U << x) < (unsigned int)(n)) x++;return x;}#line 2 "cpplib/math/mod_pow.hpp"/*** @brief (x^y)%mod*/long long mod_pow(long long x,long long y,long long mod){long long ret=1;while(y>0) {if(y&1)(ret*=x)%=mod;(x*=x)%=mod;y>>=1;}return ret;}#line 4 "cpplib/math/garner.hpp"/**** @brief ガーナーのアルゴリズム**/long long garner(const std::vector<long long>&a,const std::vector<long long>&mods){const int sz=a.size();long long coeffs[sz+1]={1,1,1,1};long long constants[sz+1]={};for(int i=0;i<sz;i++){long long v=(mods[i]+a[i]-constants[i])%mods[i]*mod_pow(coeffs[i],mods[i]-2,mods[i])%mods[i];for(int j=i+1;j<sz+1;j++) {constants[j]=(constants[j]+coeffs[j]*v)%mods[j];coeffs[j]=(coeffs[j]*mods[i])%mods[j];}}return constants[sz];}#line 6 "cpplib/math/FPS_mint.hpp"/*** @brief 形式的冪級数(ModInt)*/template<typename Mint>struct _FPS{template<typename T>T operator()(const T& _s,const T& _t){if(_s.size()==0||_t.size()==0)return T();const size_t sz=_s.size()+_t.size()-1;if((Mint::get_mod()&((1<<ceil_pow2(sz))-1))==1){std::vector<atcoder::static_modint<Mint::get_mod()>>s(_s.size()),t(_t.size());for(size_t i=0;i<_s.size();++i)s[i]=_s[i].value();for(size_t i=0;i<_t.size();++i)t[i]=_t[i].value();std::vector<atcoder::static_modint<Mint::get_mod()>> _v=atcoder::convolution(s,t);T v(_v.size());for (size_t i=0;i<_v.size();++i)v[i]=_v[i].val();return v;}else{std::vector<atcoder::static_modint<1224736769>>s1(_s.size()),t1(_t.size());std::vector<atcoder::static_modint<1045430273>>s2(_s.size()),t2(_t.size());std::vector<atcoder::static_modint<1007681537>>s3(_s.size()),t3(_t.size());for(size_t i=0;i<_s.size();++i){s1[i]=_s[i].value();s2[i]=_s[i].value();s3[i]=_s[i].value();}for(size_t i=0;i<_t.size();++i){t1[i]=_t[i].value();t2[i]=_t[i].value();t3[i]=_t[i].value();}auto v1=atcoder::convolution(s1,t1);auto v2=atcoder::convolution(s2,t2);auto v3=atcoder::convolution(s3,t3);T v(sz);for(size_t i=0;i<sz;++i){v[i]=garner(std::vector<long long>{v1[i].val(),v2[i].val(),v3[i].val()},std::vector<long long>{1224736769,1045430273,1007681537,(long long)Mint::get_mod()});}return v;}}template<typename T>T fact(const T& s){return s.fact();}template<typename T>T pow(const T& s,long long i){return s.pow(i);}};template<typename Mint>using fps=FPS_BASE<Mint,_FPS<Mint>>;#line 5 "cpplib/math/mod_int.hpp"/*** @brief ModInt*/template<int MOD>struct mod_int {using mint=mod_int<MOD>;using u64 = std::uint_fast64_t;u64 a;constexpr mod_int(const long long x = 0)noexcept:a(x>=0?x%get_mod():get_mod()-(-x)%get_mod()){}constexpr u64 &value()noexcept{return a;}constexpr const u64 &value() const noexcept {return a;}constexpr mint operator+(const mint rhs)const noexcept{return mint(*this) += rhs;}constexpr mint operator-(const mint rhs)const noexcept{return mint(*this)-=rhs;}constexpr mint operator*(const mint rhs) const noexcept {return mint(*this) *= rhs;}constexpr mint operator/(const mint rhs) const noexcept {return mint(*this) /= rhs;}constexpr mint &operator+=(const mint rhs) noexcept {a += rhs.a;if (a >= get_mod())a -= get_mod();return *this;}constexpr mint &operator-=(const mint rhs) noexcept {if (a<rhs.a)a += get_mod();a -= rhs.a;return *this;}constexpr mint &operator*=(const mint rhs) noexcept {a = a * rhs.a % get_mod();return *this;}constexpr mint operator++(int) noexcept {a += 1;if (a >= get_mod())a -= get_mod();return *this;}constexpr mint operator--(int) noexcept {if (a<1)a += get_mod();a -= 1;return *this;}constexpr mint &operator/=(mint rhs) noexcept {u64 exp=get_mod()-2;while (exp) {if (exp % 2) {*this *= rhs;}rhs *= rhs;exp /= 2;}return *this;}constexpr bool operator==(mint x) const{return a==x.a;}constexpr bool operator!=(mint x) const{return a!=x.a;}constexpr bool operator<(mint x) const{return a<x.a;}constexpr bool operator>(mint x) const{return a>x.a;}constexpr bool operator<=(mint x) const{return a<=x.a;}constexpr bool operator>=(mint x) const{return a>=x.a;}constexpr static int root(){mint root = 2;while(root.pow((get_mod()-1)>>1).a==1)root++;return root.a;}constexpr mint pow(long long n)const{long long x=a;mint ret = 1;while(n>0) {if(n&1)(ret*=x);(x*=x)%=get_mod();n>>=1;}return ret;}constexpr mint inv(){return pow(get_mod()-2);}static std::vector<mint> fac;static std::vector<mint> ifac;static bool init;constexpr static int mx=10000001;void build()const{init=0;fac.resize(mx);ifac.resize(mx);fac[0]=1,ifac[0]=1;for(int i=1;i<mx;i++)fac[i]=fac[i-1]*i;ifac[mx-1]=fac[mx-1].inv();for(int i=mx-2;i>=0;i--)ifac[i]=ifac[i+1]*(i+1);}mint comb(long long b){if(init)build();if(a<0||b<0)return 0;if(a==0&&b==0)return 1;if((long long)a<b)return 0;return fac[a]*ifac[a-b]*ifac[b];}mint fact()const{if(init)build();return fac[a];}mint fact_inv()const{if(init)build();return ifac[a];}friend std::ostream& operator<<(std::ostream& lhs, const mint& rhs) noexcept {lhs << rhs.a;return lhs;}friend std::istream& operator>>(std::istream& lhs,mint& rhs) noexcept {lhs >> rhs.a;return lhs;}constexpr static bool is_static=true;constexpr static u64 get_mod(){return MOD;}};template<int MOD>std::vector<mod_int<MOD>> mod_int<MOD>::fac;template<int MOD>std::vector<mod_int<MOD>> mod_int<MOD>::ifac;template<int MOD>bool mod_int<MOD>::init=1;#line 3 "cpplib/math/mod_int1000000007.hpp"using mint=mod_int<1'000'000'007>;constexpr int MOD=1'000'000'007;/*** @brief ModInt(1'000'000'007)*/#line 4 "code.cpp"int main(){lint m;cin>>m;const lint n=30;vector<set<pair<lint,lint>>>ans(n+1);ans[0].emplace(0,0);rep(k,n){for(auto [s,t]:ans[k]){for(auto j:{-2,0,2}){for(auto i:{-3,3}){ans[k+1].emplace(s+j,t+i);ans[k+1].emplace(s+i,t+j);}}}}fps<mint>res(n);rep(i,n){res[i]=ans[i].size();}cout<<res.guess(m)<<endl;}