#pragma once
template<typenameT,intLOG=21>structFastPow{staticconstexprlonglongB0=1LL<<LOG;staticconstexprlonglongB1=1LL<<(LOG*2);staticconstexprlonglongmask=B0-1;vector<T>p0,p1,p2;FastPow(Tbase,TI=1):p0(B0),p1(B0),p2(B0){Tx=I;for(inti=0;i<B0;i++)p0[i]=x,x*=base;base=x,x=I;for(inti=0;i<B0;i++)p1[i]=x,x*=base;base=x,x=I;for(inti=0;i<B0;i++)p2[i]=x,x*=base;}Toperator()(longlonge){assert(0<=e);if(e<B0)returnp0[e];if(e<B1)returnp0[e&mask]*p1[(e>>LOG)&mask];returnp0[e&mask]*p1[(e>>LOG)&mask]*p2[(e>>(LOG*2))&mask];}};