#include #include #include using namespace atcoder; using mint = modint1000000007; using namespace std; #define rep(i,n) for (int i = 0; i < (n); ++i) #define Inf 1000000001 template vector convolution_mint(vector a,vector b){ static constexpr unsigned long long M0 = 998244353; static constexpr unsigned long long M1 = 754974721; static constexpr unsigned long long M2 = 469762049; vector aa(a.size()),bb(b.size()); rep(i,a.size())aa[i] = a[i].val(); rep(i,b.size())bb[i] = b[i].val(); auto c0 = convolution(aa,bb); auto c1 = convolution(aa,bb); auto c2 = convolution(aa,bb); vector ret(c0.size()); vector m = {M0,M1,M2}; rep(i,c0.size()){ ret[i] += c0[i]; { long long cur = c0[i]; cur %= M1; cur = c1[i]-cur; if(cur<0)cur += M1; cur *= 416537774; cur %= M1; mint m = M0; ret[i] += m*cur; cur *= M0; cur += c0[i]; cur %= M2; cur = c2[i] - cur; if(cur<0)cur += M2; cur *= 429847628; cur %= M2; m *= M1; ret[i] += m * cur; } } return ret; } struct fast_factorial{ vector block; long long sq; fast_factorial(){ rep(i,100){ if((1LL<<(i*2))>=mint::mod()){ sq = i; break; } } block = {1,1+(1< nb((1<<(i+1))+1); rep(j,block.size()){ nb[j] = block[j] * g0[j]; } rep(j,g1.size()){ nb[i+j] = g1[j] * g2[j]; } swap(block,nb); } } vector get(vector g0,mint a){ mint m = a; m /= mint(1< ret = get_(g0,a); mint p = mint(1< get_(vector h,mint m){ int d = h.size()-1; mint fr = 1; rep(i,d)fr *= i+1; fr = fr.inv(); rep(i,d+1){ h[i] *= fr; h[d-i] *= fr; fr *= d-i; } vector h2(d+1,0); rep(i,d+1){ h2[i] = mint(m + d - i).inv(); } vector ret = convolution_mint(h,h2); while(ret.size()!=d+1)ret.pop_back(); fr = 1; rep(i,d+1)fr *= m+i; rep(i,ret.size())ret[i] *= fr; return ret; } mint query(long long n){ if(n>=mint::mod())return 0; mint ret = block[n>>sq]; for(int i=((n>>sq)<>C>>P; if(P.size()>=11){ cout<<0<="1000000007"){ cout<<0<>_t; rep(_,_t)solve(); return 0; }