#define PROBLEM "https://yukicoder.me/problems/no/215"
#include"../../template/template.hpp"//#include"../../fps/arbitrary-fps.hpp"
#include"../../modint/montgomery-modint.hpp"usingmint=LazyMontgomeryModInt<1000000007>;usingvm=vector<mint>;usingvvm=vector<vm>;usingfps=FormalPowerSeries<mint>;#include"../../fps/nth-term.hpp"usingnamespaceNyaan;voidNyaan::solve(){inl(N,P,C);vls{2,3,5,7,11,13};vlt{4,6,8,9,10,12};autocalc=[](vld,lln)->fps{llmx=d.back()*n;vvmdp(n+2,vm(mx+20));dp[0][0]=1;each(x,d)rep(i,n)rep(j,mx)dp[i+1][j+x]+=dp[i][j];returnfps{begin(dp[n]),end(dp[n])};};fpsf1=calc(s,P);fpsf2=calc(t,C);fpsf=f1*f2;f.shrink();intd=sz(f)+10;vma(d*2);vmdp(d*3+10);dp[0]=1;rep(i,2*d){reg(j,i,sz(dp))a[i]+=dp[j];rep(j,sz(f))dp[i+j]+=dp[i]*f[j];}a.erase(begin(a));out(nth_term(N-1,a));}
#line 1 "verify/verify-yuki/yuki-0215-nth-term.test.cpp"
#define PROBLEM "https://yukicoder.me/problems/no/215"
#line 2 "template/template.hpp"
usingnamespacestd;// intrinstic#include<immintrin.h>#include<algorithm>
#include<array>
#include<bitset>
#include<cassert>
#include<cctype>
#include<cfenv>
#include<cfloat>
#include<chrono>
#include<cinttypes>
#include<climits>
#include<cmath>
#include<complex>
#include<cstdarg>
#include<cstddef>
#include<cstdint>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<deque>
#include<fstream>
#include<functional>
#include<initializer_list>
#include<iomanip>
#include<ios>
#include<iostream>
#include<istream>
#include<iterator>
#include<limits>
#include<list>
#include<map>
#include<memory>
#include<new>
#include<numeric>
#include<ostream>
#include<queue>
#include<random>
#include<set>
#include<sstream>
#include<stack>
#include<streambuf>
#include<string>
#include<tuple>
#include<type_traits>
#include<typeinfo>
#include<unordered_map>
#include<unordered_set>
#include<utility>
#include<vector>// utility#line 1 "template/util.hpp"
namespaceNyaan{usingll=longlong;usingi64=longlong;usingu64=unsignedlonglong;usingi128=__int128_t;usingu128=__uint128_t;template<typenameT>usingV=vector<T>;template<typenameT>usingVV=vector<vector<T>>;usingvi=vector<int>;usingvl=vector<longlong>;usingvd=V<double>;usingvs=V<string>;usingvvi=vector<vector<int>>;usingvvl=vector<vector<longlong>>;template<typenameT>usingminpq=priority_queue<T,vector<T>,greater<T>>;template<typenameT,typenameU>structP:pair<T,U>{template<typename...Args>P(Args...args):pair<T,U>(args...){}usingpair<T,U>::first;usingpair<T,U>::second;P&operator+=(constP&r){first+=r.first;second+=r.second;return*this;}P&operator-=(constP&r){first-=r.first;second-=r.second;return*this;}P&operator*=(constP&r){first*=r.first;second*=r.second;return*this;}template<typenameS>P&operator*=(constS&r){first*=r,second*=r;return*this;}Poperator+(constP&r)const{returnP(*this)+=r;}Poperator-(constP&r)const{returnP(*this)-=r;}Poperator*(constP&r)const{returnP(*this)*=r;}template<typenameS>Poperator*(constS&r)const{returnP(*this)*=r;}Poperator-()const{returnP{-first,-second};}};usingpl=P<ll,ll>;usingpi=P<int,int>;usingvp=V<pl>;constexprintinf=1001001001;constexprlonglonginfLL=4004004004004004004LL;template<typenameT>intsz(constT&t){returnt.size();}template<typenameT,typenameU>inlineboolamin(T&x,Uy){return(y<x)?(x=y,true):false;}template<typenameT,typenameU>inlineboolamax(T&x,Uy){return(x<y)?(x=y,true):false;}template<typenameT>inlineTMax(constvector<T>&v){return*max_element(begin(v),end(v));}template<typenameT>inlineTMin(constvector<T>&v){return*min_element(begin(v),end(v));}template<typenameT>inlinelonglongSum(constvector<T>&v){returnaccumulate(begin(v),end(v),0LL);}template<typenameT>intlb(constvector<T>&v,constT&a){returnlower_bound(begin(v),end(v),a)-begin(v);}template<typenameT>intub(constvector<T>&v,constT&a){returnupper_bound(begin(v),end(v),a)-begin(v);}constexprlonglongTEN(intn){longlongret=1,x=10;for(;n;x*=x,n>>=1)ret*=(n&1?x:1);returnret;}template<typenameT,typenameU>pair<T,U>mkp(constT&t,constU&u){returnmake_pair(t,u);}template<typenameT>vector<T>mkrui(constvector<T>&v,boolrev=false){vector<T>ret(v.size()+1);if(rev){for(inti=int(v.size())-1;i>=0;i--)ret[i]=v[i]+ret[i+1];}else{for(inti=0;i<int(v.size());i++)ret[i+1]=ret[i]+v[i];}returnret;};template<typenameT>vector<T>mkuni(constvector<T>&v){vector<T>ret(v);sort(ret.begin(),ret.end());ret.erase(unique(ret.begin(),ret.end()),ret.end());returnret;}template<typenameF>vector<int>mkord(intN,Ff){vector<int>ord(N);iota(begin(ord),end(ord),0);sort(begin(ord),end(ord),f);returnord;}template<typenameT>vector<int>mkinv(vector<T>&v){intmax_val=*max_element(begin(v),end(v));vector<int>inv(max_val+1,-1);for(inti=0;i<(int)v.size();i++)inv[v[i]]=i;returninv;}vector<int>mkiota(intn){vector<int>ret(n);iota(begin(ret),end(ret),0);returnret;}template<typenameT>Tmkrev(constT&v){Tw{v};reverse(begin(w),end(w));returnw;}template<typenameT>boolnxp(T&v){returnnext_permutation(begin(v),end(v));}// 返り値の型は入力の T に依存// i 要素目 : [0, a[i])template<typenameT>vector<vector<T>>product(constvector<T>&a){vector<vector<T>>ret;vector<T>v;autodfs=[&](autorc,inti)->void{if(i==(int)a.size()){ret.push_back(v);return;}for(intj=0;j<a[i];j++)v.push_back(j),rc(rc,i+1),v.pop_back();};dfs(dfs,0);returnret;}// F : function(void(T&)), mod を取る操作// T : 整数型のときはオーバーフローに注意するtemplate<typenameT>TPower(Ta,longlongn,constT&I,constfunction<void(T&)>&f){Tres=I;for(;n;f(a=a*a),n>>=1){if(n&1)f(res=res*a);}returnres;}// T : 整数型のときはオーバーフローに注意するtemplate<typenameT>TPower(Ta,longlongn,constT&I=T{1}){returnPower(a,n,I,function<void(T&)>{[](T&)->void{}});}template<typenameT>TRev(constT&v){Tres=v;reverse(begin(res),end(res));returnres;}template<typenameT>vector<T>Transpose(constvector<T>&v){usingU=typenameT::value_type;if(v.empty())return{};intH=v.size(),W=v[0].size();vectorres(W,T(H,U{}));for(inti=0;i<H;i++){for(intj=0;j<W;j++){res[j][i]=v[i][j];}}returnres;}template<typenameT>vector<T>Rotate(constvector<T>&v,intclockwise=true){usingU=typenameT::value_type;intH=v.size(),W=v[0].size();vectorres(W,T(H,U{}));for(inti=0;i<H;i++){for(intj=0;j<W;j++){if(clockwise){res[W-1-j][i]=v[i][j];}else{res[j][H-1-i]=v[i][j];}}}returnres;}}// namespace Nyaan#line 58 "template/template.hpp"
// bit operation#line 1 "template/bitop.hpp"
namespaceNyaan{__attribute__((target("popcnt")))inlineintpopcnt(constu64&a){return__builtin_popcountll(a);}inlineintlsb(constu64&a){returna?__builtin_ctzll(a):64;}inlineintctz(constu64&a){returna?__builtin_ctzll(a):64;}inlineintmsb(constu64&a){returna?63-__builtin_clzll(a):-1;}template<typenameT>inlineintgbit(constT&a,inti){return(a>>i)&1;}template<typenameT>inlinevoidsbit(T&a,inti,boolb){if(gbit(a,i)!=b)a^=T(1)<<i;}constexprlonglongPW(intn){return1LL<<n;}constexprlonglongMSK(intn){return(1LL<<n)-1;}}// namespace Nyaan#line 61 "template/template.hpp"
// inout#line 1 "template/inout.hpp"
namespaceNyaan{template<typenameT,typenameU>ostream&operator<<(ostream&os,constpair<T,U>&p){os<<p.first<<" "<<p.second;returnos;}template<typenameT,typenameU>istream&operator>>(istream&is,pair<T,U>&p){is>>p.first>>p.second;returnis;}template<typenameT>ostream&operator<<(ostream&os,constvector<T>&v){ints=(int)v.size();for(inti=0;i<s;i++)os<<(i?" ":"")<<v[i];returnos;}template<typenameT>istream&operator>>(istream&is,vector<T>&v){for(auto&x:v)is>>x;returnis;}istream&operator>>(istream&is,__int128_t&x){stringS;is>>S;x=0;intflag=0;for(auto&c:S){if(c=='-'){flag=true;continue;}x*=10;x+=c-'0';}if(flag)x=-x;returnis;}istream&operator>>(istream&is,__uint128_t&x){stringS;is>>S;x=0;for(auto&c:S){x*=10;x+=c-'0';}returnis;}ostream&operator<<(ostream&os,__int128_tx){if(x==0)returnos<<0;if(x<0)os<<'-',x=-x;stringS;while(x)S.push_back('0'+x%10),x/=10;reverse(begin(S),end(S));returnos<<S;}ostream&operator<<(ostream&os,__uint128_tx){if(x==0)returnos<<0;stringS;while(x)S.push_back('0'+x%10),x/=10;reverse(begin(S),end(S));returnos<<S;}voidin(){}template<typenameT,class...U>voidin(T&t,U&...u){cin>>t;in(u...);}voidout(){cout<<"\n";}template<typenameT,class...U,charsep=' '>voidout(constT&t,constU&...u){cout<<t;if(sizeof...(u))cout<<sep;out(u...);}structIoSetupNya{IoSetupNya(){cin.tie(nullptr);ios::sync_with_stdio(false);cout<<fixed<<setprecision(15);cerr<<fixed<<setprecision(7);}}iosetupnya;}// namespace Nyaan#line 64 "template/template.hpp"
// debug#line 1 "template/debug.hpp"
namespaceDebugImpl{template<typenameU,typename=void>structis_specialize:false_type{};template<typenameU>structis_specialize<U,typenameconditional<false,typenameU::iterator,void>::type>:true_type{};template<typenameU>structis_specialize<U,typenameconditional<false,decltype(U::first),void>::type>:true_type{};template<typenameU>structis_specialize<U,enable_if_t<is_integral<U>::value,void>>:true_type{};voiddump(constchar&t){cerr<<t;}voiddump(conststring&t){cerr<<t;}voiddump(constbool&t){cerr<<(t?"true":"false");}voiddump(__int128_tt){if(t==0)cerr<<0;if(t<0)cerr<<'-',t=-t;stringS;while(t)S.push_back('0'+t%10),t/=10;reverse(begin(S),end(S));cerr<<S;}voiddump(__uint128_tt){if(t==0)cerr<<0;stringS;while(t)S.push_back('0'+t%10),t/=10;reverse(begin(S),end(S));cerr<<S;}template<typenameU,enable_if_t<!is_specialize<U>::value,nullptr_t>=nullptr>voiddump(constU&t){cerr<<t;}template<typenameT>voiddump(constT&t,enable_if_t<is_integral<T>::value>*=nullptr){stringres;if(t==Nyaan::inf)res="inf";ifconstexpr(is_signed<T>::value){if(t==-Nyaan::inf)res="-inf";}ifconstexpr(sizeof(T)==8){if(t==Nyaan::infLL)res="inf";ifconstexpr(is_signed<T>::value){if(t==-Nyaan::infLL)res="-inf";}}if(res.empty())res=to_string(t);cerr<<res;}template<typenameT,typenameU>voiddump(constpair<T,U>&);template<typenameT>voiddump(constpair<T*,int>&);template<typenameT>voiddump(constT&t,enable_if_t<!is_void<typenameT::iterator>::value>*=nullptr){cerr<<"[ ";for(autoit=t.begin();it!=t.end();){dump(*it);cerr<<(++it==t.end()?"":", ");}cerr<<" ]";}template<typenameT,typenameU>voiddump(constpair<T,U>&t){cerr<<"( ";dump(t.first);cerr<<", ";dump(t.second);cerr<<" )";}template<typenameT>voiddump(constpair<T*,int>&t){cerr<<"[ ";for(inti=0;i<t.second;i++){dump(t.first[i]);cerr<<(i==t.second-1?"":", ");}cerr<<" ]";}voidtrace(){cerr<<endl;}template<typenameHead,typename...Tail>voidtrace(Head&&head,Tail&&...tail){cerr<<" ";dump(head);if(sizeof...(tail)!=0)cerr<<",";trace(std::forward<Tail>(tail)...);}}// namespace DebugImpl#ifdef NyaanDebug
#define trc(...) \
do { \
cerr << "## " << #__VA_ARGS__ << " = "; \
DebugImpl::trace(__VA_ARGS__); \
} while (0)
#else
#define trc(...) (void(0))
#endif
#ifdef NyaanLocal
#define trc2(...) \
do { \
cerr << "## " << #__VA_ARGS__ << " = "; \
DebugImpl::trace(__VA_ARGS__); \
} while (0)
#else
#define trc2(...) (void(0))
#endif
#line 67 "template/template.hpp"
// macro#line 1 "template/macro.hpp"
#define each(x, v) for (auto&& x : v)
#define each2(x, y, v) for (auto&& [x, y] : v)
#define all(v) (v).begin(), (v).end()
#define rep(i, N) for (long long i = 0; i < (long long)(N); i++)
#define repr(i, N) for (long long i = (long long)(N)-1; i >= 0; i--)
#define rep1(i, N) for (long long i = 1; i <= (long long)(N); i++)
#define repr1(i, N) for (long long i = (N); (long long)(i) > 0; i--)
#define reg(i, a, b) for (long long i = (a); i < (b); i++)
#define regr(i, a, b) for (long long i = (b)-1; i >= (a); i--)
#define fi first
#define se second
#define ini(...) \
int __VA_ARGS__; \
in(__VA_ARGS__)
#define inl(...) \
long long __VA_ARGS__; \
in(__VA_ARGS__)
#define ins(...) \
string __VA_ARGS__; \
in(__VA_ARGS__)
#define in2(s, t) \
for (int i = 0; i < (int)s.size(); i++) { \
in(s[i], t[i]); \
}
#define in3(s, t, u) \
for (int i = 0; i < (int)s.size(); i++) { \
in(s[i], t[i], u[i]); \
}
#define in4(s, t, u, v) \
for (int i = 0; i < (int)s.size(); i++) { \
in(s[i], t[i], u[i], v[i]); \
}
#define die(...) \
do { \
Nyaan::out(__VA_ARGS__); \
return; \
} while (0)
#line 70 "template/template.hpp"
namespaceNyaan{voidsolve();}intmain(){Nyaan::solve();}#line 4 "verify/verify-yuki/yuki-0215-nth-term.test.cpp"
//#line 2 "fps/arbitrary-fps.hpp"
#line 2 "ntt/arbitrary-ntt.hpp"
#line 2 "modint/montgomery-modint.hpp"
template<uint32_tmod>structLazyMontgomeryModInt{usingmint=LazyMontgomeryModInt;usingi32=int32_t;usingu32=uint32_t;usingu64=uint64_t;staticconstexpru32get_r(){u32ret=mod;for(i32i=0;i<4;++i)ret*=2-mod*ret;returnret;}staticconstexpru32r=get_r();staticconstexpru32n2=-u64(mod)%mod;static_assert(mod<(1<<30),"invalid, mod >= 2 ^ 30");static_assert((mod&1)==1,"invalid, mod % 2 == 0");static_assert(r*mod==1,"this code has bugs.");u32a;constexprLazyMontgomeryModInt():a(0){}constexprLazyMontgomeryModInt(constint64_t&b):a(reduce(u64(b%mod+mod)*n2)){};staticconstexpru32reduce(constu64&b){return(b+u64(u32(b)*u32(-r))*mod)>>32;}constexprmint&operator+=(constmint&b){if(i32(a+=b.a-2*mod)<0)a+=2*mod;return*this;}constexprmint&operator-=(constmint&b){if(i32(a-=b.a)<0)a+=2*mod;return*this;}constexprmint&operator*=(constmint&b){a=reduce(u64(a)*b.a);return*this;}constexprmint&operator/=(constmint&b){*this*=b.inverse();return*this;}constexprmintoperator+(constmint&b)const{returnmint(*this)+=b;}constexprmintoperator-(constmint&b)const{returnmint(*this)-=b;}constexprmintoperator*(constmint&b)const{returnmint(*this)*=b;}constexprmintoperator/(constmint&b)const{returnmint(*this)/=b;}constexprbooloperator==(constmint&b)const{return(a>=mod?a-mod:a)==(b.a>=mod?b.a-mod:b.a);}constexprbooloperator!=(constmint&b)const{return(a>=mod?a-mod:a)!=(b.a>=mod?b.a-mod:b.a);}constexprmintoperator-()const{returnmint()-mint(*this);}constexprmintoperator+()const{returnmint(*this);}constexprmintpow(u64n)const{mintret(1),mul(*this);while(n>0){if(n&1)ret*=mul;mul*=mul;n>>=1;}returnret;}constexprmintinverse()const{intx=get(),y=mod,u=1,v=0,t=0,tmp=0;while(y>0){t=x/y;x-=t*y,u-=t*v;tmp=x,x=y,y=tmp;tmp=u,u=v,v=tmp;}returnmint{u};}friendostream&operator<<(ostream&os,constmint&b){returnos<<b.get();}friendistream&operator>>(istream&is,mint&b){int64_tt;is>>t;b=LazyMontgomeryModInt<mod>(t);return(is);}constexpru32get()const{u32ret=reduce(a);returnret>=mod?ret-mod:ret;}staticconstexpru32get_mod(){returnmod;}};#line 2 "ntt/ntt.hpp"
template<typenamemint>structNTT{staticconstexpruint32_tget_pr(){uint32_t_mod=mint::get_mod();usingu64=uint64_t;u64ds[32]={};intidx=0;u64m=_mod-1;for(u64i=2;i*i<=m;++i){if(m%i==0){ds[idx++]=i;while(m%i==0)m/=i;}}if(m!=1)ds[idx++]=m;uint32_t_pr=2;while(1){intflg=1;for(inti=0;i<idx;++i){u64a=_pr,b=(_mod-1)/ds[i],r=1;while(b){if(b&1)r=r*a%_mod;a=a*a%_mod;b>>=1;}if(r==1){flg=0;break;}}if(flg==1)break;++_pr;}return_pr;};staticconstexpruint32_tmod=mint::get_mod();staticconstexpruint32_tpr=get_pr();staticconstexprintlevel=__builtin_ctzll(mod-1);mintdw[level],dy[level];voidsetwy(intk){mintw[level],y[level];w[k-1]=mint(pr).pow((mod-1)/(1<<k));y[k-1]=w[k-1].inverse();for(inti=k-2;i>0;--i)w[i]=w[i+1]*w[i+1],y[i]=y[i+1]*y[i+1];dw[1]=w[1],dy[1]=y[1],dw[2]=w[2],dy[2]=y[2];for(inti=3;i<k;++i){dw[i]=dw[i-1]*y[i-2]*w[i];dy[i]=dy[i-1]*w[i-2]*y[i];}}NTT(){setwy(level);}voidfft4(vector<mint>&a,intk){if((int)a.size()<=1)return;if(k==1){minta1=a[1];a[1]=a[0]-a[1];a[0]=a[0]+a1;return;}if(k&1){intv=1<<(k-1);for(intj=0;j<v;++j){mintajv=a[j+v];a[j+v]=a[j]-ajv;a[j]+=ajv;}}intu=1<<(2+(k&1));intv=1<<(k-2-(k&1));mintone=mint(1);mintimag=dw[1];while(v){// jh = 0{intj0=0;intj1=v;intj2=j1+v;intj3=j2+v;for(;j0<v;++j0,++j1,++j2,++j3){mintt0=a[j0],t1=a[j1],t2=a[j2],t3=a[j3];mintt0p2=t0+t2,t1p3=t1+t3;mintt0m2=t0-t2,t1m3=(t1-t3)*imag;a[j0]=t0p2+t1p3,a[j1]=t0p2-t1p3;a[j2]=t0m2+t1m3,a[j3]=t0m2-t1m3;}}// jh >= 1mintww=one,xx=one*dw[2],wx=one;for(intjh=4;jh<u;){ww=xx*xx,wx=ww*xx;intj0=jh*v;intje=j0+v;intj2=je+v;for(;j0<je;++j0,++j2){mintt0=a[j0],t1=a[j0+v]*xx,t2=a[j2]*ww,t3=a[j2+v]*wx;mintt0p2=t0+t2,t1p3=t1+t3;mintt0m2=t0-t2,t1m3=(t1-t3)*imag;a[j0]=t0p2+t1p3,a[j0+v]=t0p2-t1p3;a[j2]=t0m2+t1m3,a[j2+v]=t0m2-t1m3;}xx*=dw[__builtin_ctzll((jh+=4))];}u<<=2;v>>=2;}}voidifft4(vector<mint>&a,intk){if((int)a.size()<=1)return;if(k==1){minta1=a[1];a[1]=a[0]-a[1];a[0]=a[0]+a1;return;}intu=1<<(k-2);intv=1;mintone=mint(1);mintimag=dy[1];while(u){// jh = 0{intj0=0;intj1=v;intj2=v+v;intj3=j2+v;for(;j0<v;++j0,++j1,++j2,++j3){mintt0=a[j0],t1=a[j1],t2=a[j2],t3=a[j3];mintt0p1=t0+t1,t2p3=t2+t3;mintt0m1=t0-t1,t2m3=(t2-t3)*imag;a[j0]=t0p1+t2p3,a[j2]=t0p1-t2p3;a[j1]=t0m1+t2m3,a[j3]=t0m1-t2m3;}}// jh >= 1mintww=one,xx=one*dy[2],yy=one;u<<=2;for(intjh=4;jh<u;){ww=xx*xx,yy=xx*imag;intj0=jh*v;intje=j0+v;intj2=je+v;for(;j0<je;++j0,++j2){mintt0=a[j0],t1=a[j0+v],t2=a[j2],t3=a[j2+v];mintt0p1=t0+t1,t2p3=t2+t3;mintt0m1=(t0-t1)*xx,t2m3=(t2-t3)*yy;a[j0]=t0p1+t2p3,a[j2]=(t0p1-t2p3)*ww;a[j0+v]=t0m1+t2m3,a[j2+v]=(t0m1-t2m3)*ww;}xx*=dy[__builtin_ctzll(jh+=4)];}u>>=4;v<<=2;}if(k&1){u=1<<(k-1);for(intj=0;j<u;++j){mintajv=a[j]-a[j+u];a[j]+=a[j+u];a[j+u]=ajv;}}}voidntt(vector<mint>&a){if((int)a.size()<=1)return;fft4(a,__builtin_ctz(a.size()));}voidintt(vector<mint>&a){if((int)a.size()<=1)return;ifft4(a,__builtin_ctz(a.size()));mintiv=mint(a.size()).inverse();for(auto&x:a)x*=iv;}vector<mint>multiply(constvector<mint>&a,constvector<mint>&b){intl=a.size()+b.size()-1;if(min<int>(a.size(),b.size())<=40){vector<mint>s(l);for(inti=0;i<(int)a.size();++i)for(intj=0;j<(int)b.size();++j)s[i+j]+=a[i]*b[j];returns;}intk=2,M=4;while(M<l)M<<=1,++k;setwy(k);vector<mint>s(M);for(inti=0;i<(int)a.size();++i)s[i]=a[i];fft4(s,k);if(a.size()==b.size()&&a==b){for(inti=0;i<M;++i)s[i]*=s[i];}else{vector<mint>t(M);for(inti=0;i<(int)b.size();++i)t[i]=b[i];fft4(t,k);for(inti=0;i<M;++i)s[i]*=t[i];}ifft4(s,k);s.resize(l);mintinvm=mint(M).inverse();for(inti=0;i<l;++i)s[i]*=invm;returns;}voidntt_doubling(vector<mint>&a){intM=(int)a.size();autob=a;intt(b);mintr=1,zeta=mint(pr).pow((mint::get_mod()-1)/(M<<1));for(inti=0;i<M;i++)b[i]*=r,r*=zeta;ntt(b);copy(begin(b),end(b),back_inserter(a));}};#line 5 "ntt/arbitrary-ntt.hpp"
namespaceArbitraryNTT{usingi64=int64_t;usingu128=__uint128_t;constexprint32_tm0=167772161;constexprint32_tm1=469762049;constexprint32_tm2=754974721;usingmint0=LazyMontgomeryModInt<m0>;usingmint1=LazyMontgomeryModInt<m1>;usingmint2=LazyMontgomeryModInt<m2>;constexprintr01=mint1(m0).inverse().get();constexprintr02=mint2(m0).inverse().get();constexprintr12=mint2(m1).inverse().get();constexprintr02r12=i64(r02)*r12%m2;constexpri64w1=m0;constexpri64w2=i64(m0)*m1;template<typenameT,typenamesubmint>vector<submint>mul(constvector<T>&a,constvector<T>&b){staticNTT<submint>ntt;vector<submint>s(a.size()),t(b.size());for(inti=0;i<(int)a.size();++i)s[i]=i64(a[i]%submint::get_mod());for(inti=0;i<(int)b.size();++i)t[i]=i64(b[i]%submint::get_mod());returnntt.multiply(s,t);}template<typenameT>vector<int>multiply(constvector<T>&s,constvector<T>&t,intmod){autod0=mul<T,mint0>(s,t);autod1=mul<T,mint1>(s,t);autod2=mul<T,mint2>(s,t);intn=d0.size();vector<int>ret(n);constintW1=w1%mod;constintW2=w2%mod;for(inti=0;i<n;i++){intn1=d1[i].get(),n2=d2[i].get(),a=d0[i].get();intb=i64(n1+m1-a)*r01%m1;intc=(i64(n2+m2-a)*r02r12+i64(m2-b)*r12)%m2;ret[i]=(i64(a)+i64(b)*W1+i64(c)*W2)%mod;}returnret;}template<typenamemint>vector<mint>multiply(constvector<mint>&a,constvector<mint>&b){if(a.size()==0&&b.size()==0)return{};if(min<int>(a.size(),b.size())<128){vector<mint>ret(a.size()+b.size()-1);for(inti=0;i<(int)a.size();++i)for(intj=0;j<(int)b.size();++j)ret[i+j]+=a[i]*b[j];returnret;}vector<int>s(a.size()),t(b.size());for(inti=0;i<(int)a.size();++i)s[i]=a[i].get();for(inti=0;i<(int)b.size();++i)t[i]=b[i].get();vector<int>u=multiply<int>(s,t,mint::get_mod());vector<mint>ret(u.size());for(inti=0;i<(int)u.size();++i)ret[i]=mint(u[i]);returnret;}template<typenameT>vector<u128>multiply_u128(constvector<T>&s,constvector<T>&t){if(s.size()==0&&t.size()==0)return{};if(min<int>(s.size(),t.size())<128){vector<u128>ret(s.size()+t.size()-1);for(inti=0;i<(int)s.size();++i)for(intj=0;j<(int)t.size();++j)ret[i+j]+=i64(s[i])*t[j];returnret;}autod0=mul<T,mint0>(s,t);autod1=mul<T,mint1>(s,t);autod2=mul<T,mint2>(s,t);intn=d0.size();vector<u128>ret(n);for(inti=0;i<n;i++){i64n1=d1[i].get(),n2=d2[i].get();i64a=d0[i].get();i64b=(n1+m1-a)*r01%m1;i64c=((n2+m2-a)*r02r12+(m2-b)*r12)%m2;ret[i]=a+b*w1+u128(c)*w2;}returnret;}}// namespace ArbitraryNTT#line 2 "fps/formal-power-series.hpp"
template<typenamemint>structFormalPowerSeries:vector<mint>{usingvector<mint>::vector;usingFPS=FormalPowerSeries;FPS&operator+=(constFPS&r){if(r.size()>this->size())this->resize(r.size());for(inti=0;i<(int)r.size();i++)(*this)[i]+=r[i];return*this;}FPS&operator+=(constmint&r){if(this->empty())this->resize(1);(*this)[0]+=r;return*this;}FPS&operator-=(constFPS&r){if(r.size()>this->size())this->resize(r.size());for(inti=0;i<(int)r.size();i++)(*this)[i]-=r[i];return*this;}FPS&operator-=(constmint&r){if(this->empty())this->resize(1);(*this)[0]-=r;return*this;}FPS&operator*=(constmint&v){for(intk=0;k<(int)this->size();k++)(*this)[k]*=v;return*this;}FPS&operator/=(constFPS&r){if(this->size()<r.size()){this->clear();return*this;}intn=this->size()-r.size()+1;if((int)r.size()<=64){FPSf(*this),g(r);g.shrink();mintcoeff=g.back().inverse();for(auto&x:g)x*=coeff;intdeg=(int)f.size()-(int)g.size()+1;intgs=g.size();FPSquo(deg);for(inti=deg-1;i>=0;i--){quo[i]=f[i+gs-1];for(intj=0;j<gs;j++)f[i+j]-=quo[i]*g[j];}*this=quo*coeff;this->resize(n,mint(0));return*this;}return*this=((*this).rev().pre(n)*r.rev().inv(n)).pre(n).rev();}FPS&operator%=(constFPS&r){*this-=*this/r*r;shrink();return*this;}FPSoperator+(constFPS&r)const{returnFPS(*this)+=r;}FPSoperator+(constmint&v)const{returnFPS(*this)+=v;}FPSoperator-(constFPS&r)const{returnFPS(*this)-=r;}FPSoperator-(constmint&v)const{returnFPS(*this)-=v;}FPSoperator*(constFPS&r)const{returnFPS(*this)*=r;}FPSoperator*(constmint&v)const{returnFPS(*this)*=v;}FPSoperator/(constFPS&r)const{returnFPS(*this)/=r;}FPSoperator%(constFPS&r)const{returnFPS(*this)%=r;}FPSoperator-()const{FPSret(this->size());for(inti=0;i<(int)this->size();i++)ret[i]=-(*this)[i];returnret;}voidshrink(){while(this->size()&&this->back()==mint(0))this->pop_back();}FPSrev()const{FPSret(*this);reverse(begin(ret),end(ret));returnret;}FPSdot(FPSr)const{FPSret(min(this->size(),r.size()));for(inti=0;i<(int)ret.size();i++)ret[i]=(*this)[i]*r[i];returnret;}// 前 sz 項を取ってくる。sz に足りない項は 0 埋めするFPSpre(intsz)const{FPSret(begin(*this),begin(*this)+min((int)this->size(),sz));if((int)ret.size()<sz)ret.resize(sz);returnret;}FPSoperator>>(intsz)const{if((int)this->size()<=sz)return{};FPSret(*this);ret.erase(ret.begin(),ret.begin()+sz);returnret;}FPSoperator<<(intsz)const{FPSret(*this);ret.insert(ret.begin(),sz,mint(0));returnret;}FPSdiff()const{constintn=(int)this->size();FPSret(max(0,n-1));mintone(1),coeff(1);for(inti=1;i<n;i++){ret[i-1]=(*this)[i]*coeff;coeff+=one;}returnret;}FPSintegral()const{constintn=(int)this->size();FPSret(n+1);ret[0]=mint(0);if(n>0)ret[1]=mint(1);automod=mint::get_mod();for(inti=2;i<=n;i++)ret[i]=(-ret[mod%i])*(mod/i);for(inti=0;i<n;i++)ret[i+1]*=(*this)[i];returnret;}minteval(mintx)const{mintr=0,w=1;for(auto&v:*this)r+=w*v,w*=x;returnr;}FPSlog(intdeg=-1)const{assert(!(*this).empty()&&(*this)[0]==mint(1));if(deg==-1)deg=(int)this->size();return(this->diff()*this->inv(deg)).pre(deg-1).integral();}FPSpow(int64_tk,intdeg=-1)const{constintn=(int)this->size();if(deg==-1)deg=n;if(k==0){FPSret(deg);if(deg)ret[0]=1;returnret;}for(inti=0;i<n;i++){if((*this)[i]!=mint(0)){mintrev=mint(1)/(*this)[i];FPSret=(((*this*rev)>>i).log(deg)*k).exp(deg);ret*=(*this)[i].pow(k);ret=(ret<<(i*k)).pre(deg);if((int)ret.size()<deg)ret.resize(deg,mint(0));returnret;}if(__int128_t(i+1)*k>=deg)returnFPS(deg,mint(0));}returnFPS(deg,mint(0));}staticvoid*ntt_ptr;staticvoidset_fft();FPS&operator*=(constFPS&r);voidntt();voidintt();voidntt_doubling();staticintntt_pr();FPSinv(intdeg=-1)const;FPSexp(intdeg=-1)const;};template<typenamemint>void*FormalPowerSeries<mint>::ntt_ptr=nullptr;/**
* @brief 多項式/形式的冪級数ライブラリ
* @docs docs/fps/formal-power-series.md
*/#line 5 "fps/arbitrary-fps.hpp"
template<typenamemint>voidFormalPowerSeries<mint>::set_fft(){ntt_ptr=nullptr;}template<typenamemint>voidFormalPowerSeries<mint>::ntt(){exit(1);}template<typenamemint>voidFormalPowerSeries<mint>::intt(){exit(1);}template<typenamemint>voidFormalPowerSeries<mint>::ntt_doubling(){exit(1);}template<typenamemint>intFormalPowerSeries<mint>::ntt_pr(){exit(1);}template<typenamemint>FormalPowerSeries<mint>&FormalPowerSeries<mint>::operator*=(constFormalPowerSeries<mint>&r){if(this->empty()||r.empty()){this->clear();return*this;}autoret=ArbitraryNTT::multiply(*this,r);return*this=FormalPowerSeries<mint>(ret.begin(),ret.end());}template<typenamemint>FormalPowerSeries<mint>FormalPowerSeries<mint>::inv(intdeg)const{assert((*this)[0]!=mint(0));if(deg==-1)deg=(*this).size();FormalPowerSeries<mint>ret({mint(1)/(*this)[0]});for(inti=1;i<deg;i<<=1)ret=(ret+ret-ret*ret*(*this).pre(i<<1)).pre(i<<1);returnret.pre(deg);}template<typenamemint>FormalPowerSeries<mint>FormalPowerSeries<mint>::exp(intdeg)const{assert((*this).size()==0||(*this)[0]==mint(0));if(deg==-1)deg=(int)this->size();FormalPowerSeries<mint>ret({mint(1)});for(inti=1;i<deg;i<<=1){ret=(ret*(pre(i<<1)+mint(1)-ret.log(i<<1))).pre(i<<1);}returnret.pre(deg);}#line 7 "verify/verify-yuki/yuki-0215-nth-term.test.cpp"
usingmint=LazyMontgomeryModInt<1000000007>;usingvm=vector<mint>;usingvvm=vector<vm>;usingfps=FormalPowerSeries<mint>;#line 2 "fps/nth-term.hpp"
#line 2 "fps/berlekamp-massey.hpp"
template<typenamemint>vector<mint>BerlekampMassey(constvector<mint>&s){constintN=(int)s.size();vector<mint>b,c;b.reserve(N+1);c.reserve(N+1);b.push_back(mint(1));c.push_back(mint(1));minty=mint(1);for(inted=1;ed<=N;ed++){intl=int(c.size()),m=int(b.size());mintx=0;for(inti=0;i<l;i++)x+=c[i]*s[ed-l+i];b.emplace_back(mint(0));m++;if(x==mint(0))continue;mintfreq=x/y;if(l<m){autotmp=c;c.insert(begin(c),m-l,mint(0));for(inti=0;i<m;i++)c[m-1-i]-=freq*b[m-1-i];b=tmp;y=x;}else{for(inti=0;i<m;i++)c[l-1-i]-=freq*b[m-1-i];}}reverse(begin(c),end(c));returnc;}#line 2 "fps/kitamasa.hpp"
#line 4 "fps/kitamasa.hpp"
template<typenamemint>mintLinearRecurrence(longlongk,FormalPowerSeries<mint>Q,FormalPowerSeries<mint>P){Q.shrink();mintret=0;if(P.size()>=Q.size()){autoR=P/Q;P-=R*Q;P.shrink();if(k<(int)R.size())ret+=R[k];}if((int)P.size()==0)returnret;FormalPowerSeries<mint>::set_fft();if(FormalPowerSeries<mint>::ntt_ptr==nullptr){P.resize((int)Q.size()-1);while(k){autoQ2=Q;for(inti=1;i<(int)Q2.size();i+=2)Q2[i]=-Q2[i];autoS=P*Q2;autoT=Q*Q2;if(k&1){for(inti=1;i<(int)S.size();i+=2)P[i>>1]=S[i];for(inti=0;i<(int)T.size();i+=2)Q[i>>1]=T[i];}else{for(inti=0;i<(int)S.size();i+=2)P[i>>1]=S[i];for(inti=0;i<(int)T.size();i+=2)Q[i>>1]=T[i];}k>>=1;}returnret+P[0];}else{intN=1;while(N<(int)Q.size())N<<=1;P.resize(2*N);Q.resize(2*N);P.ntt();Q.ntt();vector<mint>S(2*N),T(2*N);vector<int>btr(N);for(inti=0,logn=__builtin_ctz(N);i<(1<<logn);i++){btr[i]=(btr[i>>1]>>1)+((i&1)<<(logn-1));}mintdw=mint(FormalPowerSeries<mint>::ntt_pr()).inverse().pow((mint::get_mod()-1)/(2*N));while(k){mintinv2=mint(2).inverse();// even degree of Q(x)Q(-x)T.resize(N);for(inti=0;i<N;i++)T[i]=Q[(i<<1)|0]*Q[(i<<1)|1];S.resize(N);if(k&1){// odd degree of P(x)Q(-x)for(auto&i:btr){S[i]=(P[(i<<1)|0]*Q[(i<<1)|1]-P[(i<<1)|1]*Q[(i<<1)|0])*inv2;inv2*=dw;}}else{// even degree of P(x)Q(-x)for(inti=0;i<N;i++){S[i]=(P[(i<<1)|0]*Q[(i<<1)|1]+P[(i<<1)|1]*Q[(i<<1)|0])*inv2;}}swap(P,S);swap(Q,T);k>>=1;if(k<N)break;P.ntt_doubling();Q.ntt_doubling();}P.intt();Q.intt();returnret+(P*(Q.inv()))[k];}}template<typenamemint>mintkitamasa(longlongN,FormalPowerSeries<mint>Q,FormalPowerSeries<mint>a){assert(!Q.empty()&&Q[0]!=0);if(N<(int)a.size())returna[N];assert((int)a.size()>=int(Q.size())-1);autoP=a.pre((int)Q.size()-1)*Q;P.resize(Q.size()-1);returnLinearRecurrence<mint>(N,Q,P);}/**
* @brief 線形漸化式の高速計算
* @docs docs/fps/kitamasa.md
*/#line 5 "fps/nth-term.hpp"
template<typenamemint>mintnth_term(longlongn,constvector<mint>&s){usingfps=FormalPowerSeries<mint>;autobm=BerlekampMassey<mint>(s);returnkitamasa(n,fps{begin(bm),end(bm)},fps{begin(s),end(s)});}/**
* @brief 線形回帰数列の高速計算(Berlekamp-Massey/Bostan-Mori)
* @docs docs/fps/nth-term.md
*/#line 13 "verify/verify-yuki/yuki-0215-nth-term.test.cpp"
usingnamespaceNyaan;voidNyaan::solve(){inl(N,P,C);vls{2,3,5,7,11,13};vlt{4,6,8,9,10,12};autocalc=[](vld,lln)->fps{llmx=d.back()*n;vvmdp(n+2,vm(mx+20));dp[0][0]=1;each(x,d)rep(i,n)rep(j,mx)dp[i+1][j+x]+=dp[i][j];returnfps{begin(dp[n]),end(dp[n])};};fpsf1=calc(s,P);fpsf2=calc(t,C);fpsf=f1*f2;f.shrink();intd=sz(f)+10;vma(d*2);vmdp(d*3+10);dp[0]=1;rep(i,2*d){reg(j,i,sz(dp))a[i]+=dp[j];rep(j,sz(f))dp[i+j]+=dp[i]*f[j];}a.erase(begin(a));out(nth_term(N-1,a));}