#pragma once
template<typenamerig>structLinearRecursive{vector<rig>C;intN;LinearRecursive(constvector<rig>&c):C(c),N(c.size()){}rigkth_term(vector<rig>a,longlongk){assert(a.size()==C.size());if(k<(int)a.size())returna[k];autocoeff=get_coeff(k);rigres=rig::id0();for(inti=0;i<N;i++)res+=a[i]*coeff[N-1-i];returnres;}vector<rig>get_coeff(longlongk){if(k==0){vector<rig>b(N,rig::id0());b.back()=rig::id1();returnb;}autohalf=get_coeff(k/2);doubling(half);if(k&1)increment(half);returnhalf;}voidincrement(vector<rig>&b){vector<rig>v{begin(b)+1,end(b)};v.push_back(rig::id0());for(inti=0;i<N;i++)v[i]+=b[0]*C[i];b.swap(v);}voiddoubling(vector<rig>&b){vector<rig>v(N,rig::id0()),bb{b};for(inti=0;i<N;i++){for(intj=0;j<N;j++){v[j]+=bb[j]*b[N-1-i];}increment(bb);}swap(b,v);}};