#include #include #include #include using namespace std; namespace NTT{ long long extgcd(long long a,long long b,long long&x,long long&y){ for(long long u=y=1,v=x=0;a;){ long long q=b/a;swap(x-=q*u,u);swap(y-=q*v,v);swap(b-=q*a,a); } return b; } long long mod_inv(long long a,long long m){ long long x,y; extgcd(a,m,x,y); return (m+x%m)%m; } long long mod_pow(long long a,long long b,long long m){ long long ret=1; while(b){ if(b%2)ret=ret*a%m; b/=2; a=a*a%m; } return ret; } map >, vector > memo; template class NTT{ public: int get_mod()const{return mod;} void _ntt(vector&a,int sign){ const int n=a.size(); const int g=3; int h=(int)mod_pow(g,(mod-1)/n,mod); if(sign==-1)h=(int)mod_inv(h,mod); int i=0; for(int j=1;j>1;k>(i^=k);k>>=1); if(j=mod)a[s]-=mod; a[s+m]=u-d; if(a[s+m]<0)a[s+m]+=mod; } w=w*base%mod; } } for(int i=0;i&input){ _ntt(input,1); } void intt(vector&input){ _ntt(input,-1); const int n_inv=mod_inv(input.size(),mod); for(int i=0;iconvolution(const vector&a,const vector&b){ int ntt_size=1; while(ntt_size_a=a,_b=b; _a.resize(ntt_size); _b.resize(ntt_size); if(memo.count(make_pair(mod,a)))_a=memo[make_pair(mod,a)]; else{ ntt(_a); // memo[make_pair(mod,a)]=_a; } if(memo.count(make_pair(mod,_b)))_b=memo[make_pair(mod,b)]; else{ ntt(_b); // memo[make_pair(mod,b)]=_b; } for(int i=0;i > mr,long long mod){ mr.push_back(make_pair(mod,0)); vectorcoffs(mr.size(),1); vectorconstants(mr.size(),0); for(int i=0;i NTT_1; typedef NTT<469762049,3> NTT_2; typedef NTT<1224736769,3> NTT_3; /*vectorint32mod_convolution(vectora,vectorb,int mod){ for(int i=0;ix=ntt1.convolution(a,b); vectory=ntt2.convolution(a,b); vectorz=ntt3.convolution(a,b); vectorret(x.size()); vector >mr(3); for(int i=0;i int32mod_convolution(vectora,vectorb,int mod){ for(int i=0;ix=ntt1.convolution(a,b); vectory=ntt2.convolution(a,b); vectorz=ntt3.convolution(a,b); const long long m1=ntt1.get_mod(); const long long m2=ntt2.get_mod(); const long long m3=ntt3.get_mod(); const long long m1_inv_m2=mod_inv(m1,m2); const long long m12_inv_m3=mod_inv(m1*m2,m3); const long long m12_mod=m1*m2%mod; vectorret(x.size()); for(int i=0;ig; vectorh; vector calc(long long t){ // printf("%lld\n",t); if(tret(8000); ret[t]=1; return ret; } vectorchi=calc(t/2); vectorna(8000); for(int i=0;i<8000;i++){ na[i]=chi[i]; } vectorf=NTT::int32mod_convolution(na,na,mod); if(t%2){ for(int i=16383;i>0;i--)f[i]=f[i-1]; f[0]=0; } f.resize(16010); vector_f=f; reverse(_f.begin(),_f.end()); _f.resize(8010); vectorq=NTT::int32mod_convolution(_f,h,mod); q.resize(8010); reverse(q.begin(),q.end()); vectorr=NTT::int32mod_convolution(q,g,mod); // printf("%d %d\n",r.size(),f.size()); for(int i=0;i_g=g; reverse(_g.begin(),_g.end()); h.push_back(1); int L=1; while(L<8010){ vectorh2=NTT::int32mod_convolution(h,h,mod); vectortg=_g; tg.resize(L*2); h2=NTT::int32mod_convolution(h2,tg,mod); h2.resize(L*2); for(int i=0;i ans=calc(n+7999); long long ret=0; for(int i=0;i<8000;i++){ ret=(ret+ans[i])%mod; } printf("%lld\n",ret); }