#include using namespace std; #define rep(i,n) for(int i=0; ib ? a=b, true : false; } using ll=long long; const int INF=1e9+10; const ll INFL=4e18; #ifdef DEBUG #include "./debug.hpp" #else #define debug(...) #define print_line #endif /// @brief ModInt template struct ModInt { ModInt(ll x=0){ value=(x>=0?x%MOD:MOD-(-x)%MOD); } ModInt operator-() const { return ModInt(-value); } ModInt operator+() const { return ModInt(*this); } ModInt& operator+=(const ModInt& other) { value+=other.value; if(value>=MOD) value-=MOD; return*this; } ModInt& operator-=(const ModInt& other) { value+=MOD-other.value; if(value>=MOD) value-=MOD; return*this; } ModInt& operator*=(const ModInt other) { value=value*other.value%MOD; return*this; } ModInt& operator/=(ModInt other) { (*this)*=other.inv(); return*this; } ModInt operator+(const ModInt& other) const { return ModInt(*this)+=other; } ModInt operator-(const ModInt& other) const { return ModInt(*this)-=other; } ModInt operator*(const ModInt& other) const { return ModInt(*this)*=other; } ModInt operator/(const ModInt& other) const { return ModInt(*this)/=other; } bool operator==(const ModInt& other) const { return value==other.value; } bool operator!=(const ModInt& other) const { return value!=other.value; } friend ostream& operator<<(ostream& os, const ModInt& x) { return os<>(istream& is, ModInt& x) { ll v; is>>v; x=ModInt(v); return is; } ModInt pow(ll x) const { ModInt ret(1),mul(value); while(x) { if(x&1) ret*=mul; mul*=mul; x>>=1; } return ret; } ModInt inv() const { return pow(MOD-2); } ll val() {return value; } static constexpr ll mod() { return MOD; } private: ll value; }; using Mod998=ModInt<998244353>; using Mod107=ModInt<1000000007>; /// @brief 数論変換 /// @note O(N log(N)) /// @details f(x) = Σ a[i]x^i, w^N = 1 とすると、F(t) = Σ f(w^i)t^i の各係数 mod 998244353 に変換する void NTT998(vector& a, bool inv=false) { static bool flag=false; static int divide_max; static vector roots, inv_roots, tmp; if(!flag) { flag=true; divide_max=1; ll n=998244353-1; while(n%2==0) n>>=1,divide_max++; roots=vector(divide_max+1); inv_roots=vector(divide_max+1); roots[0]=inv_roots[0]=1; for(int i=1; i<=divide_max; i++) { roots[i]=Mod998(3).pow((998244353-1)/(1<(a.size()); int n=a.size(), mask=n-1, p=0; for(int i=n>>1; i>=1; i>>=1) { auto& cur=((p&1) ? tmp : a); auto& nxt=((p&1) ? a : tmp); Mod998 e=(inv ? roots[p+1] : inv_roots[p+1]); Mod998 w=1; for(int j=0; j Convolve998(vector a,vector b) { int n=1; while(n+1 fa(n), fb(n); for(int i=0; ia.size()+b.size()) fa.pop_back(); return fa; } using Fps=vector; //< 多項式 using FpsSparse=vector>; //< 疎な多項式((次数, 係数)の配列) /// @brief 形式的冪級数 /// @ref https://potato167.github.io/po167_library namespace FPS { /// @brief 多項式 f, g の和を返す Fps Add(const Fps& a, const Fps& b) { Fps res(max(a.size(),b.size())); for(int i=0; ii) res[i]=f[i]; nxtg[i]=g[i]; } //fg_high を計算 NTT998(g); NTT998(res); for(int i=0; i0; i--) f[i]=f[i-1]*num_inv[i]; f[0]=0; return f; } /// @brief 多項式 f の微分を返す Fps Differential(Fps f) { if(f.empty()) return f; for(int i=0; i<(int)f.size()-1; i++) f[i]=f[i+1]*(Mod998)(i+1); f.pop_back(); return f; } /// @brief 多項式 f, g について、`f = gq + r` なる q, r を返す pair Div(Fps f, Fps g) { int n=f.size(),m=g.size(); if(nsecond; g.erase(itr); } for(int i=(int)f.size()-1; i>=0; i--) { for(auto& [d,c]: g) { if(i+d>=f.size()) continue; f[i+d]+=f[i]*c; } f[i]*=x0; } return f; } /// @brief 多項式 f, g に対し、 f / g を返す(ただし、g は疎な多項式として与える) Fps DivSparse(Fps f, FpsSparse g) { auto itr=find_if(g.begin(),g.end(),[&](auto p) { return p.first==0; }); assert(itr!=g.end()); Mod998 x0_inv=itr->second.inv(); g.erase(itr); for(int i=0; i=f.size()) continue; f[i+d]-=f[i]*c; } } return f; } namespace Internal { const int PRIMITIVE_ROOT=3; Fps CyclicConvolution(Fps f, Fps g) { NTT998(f); NTT998(g); for(int i=0; i<(int)f.size(); i++) f[i]*=g[i]; NTT998(f,true); return f; } //in :DFT(v)(len(v)=z) //out:DFT(v)(len(v)=2*z) void Extend(Fps& v) { int z=v.size(); Mod998 e=Mod998(PRIMITIVE_ROOT).pow(Mod998::mod()/(2*z)); auto cp=v; NTT998(cp,true); Mod998 tmp=1; for(int i=0; i(len-1)/M) break; Fps g((int)f.size()-i); Mod998 v=(Mod998)(1)/(Mod998)(f[i]); for(int j=i; j<(int)f.size(); j++) g[j-i]=f[j]*v; ll zero=i*M; if(i) len-=i*M; g=Log(g,len); for(Mod998& x:g) x*=M; g=Exp(g,len); v=(Mod998)(1)/v; Mod998 c=1; while(M) { if(M&1) c=c*v; v=v*v; M>>=1; } for(int i=0; i BerlekampMassey(const vector& s) { int n=s.size(); vector c{1}, b{1}; int l=0, m=1; Mod998 bb=1; for(int i=0; i b, c; // b.reserve(N + 1); c.reserve(N + 1); b.push_back(Mod998(1)); c.push_back(Mod998(1)); // Mod998 y = Mod998(1); // for (int ed = 1; ed <= N; ed++) { // int l = int(c.size()), m = int(b.size()); Mod998 x = 0; // for (int i = 0; i < l; i++) x += c[i] * f[ed - l + i]; // b.emplace_back(Mod998(0)); m++; // if (x == Mod998(0)) continue; // Mod998 freq = x / y; // if (l < m) { // auto tmp = c; c.insert(begin(c), m - l, Mod998(0)); // for (int i = 0; i < m; i++) c[m - 1 - i] -= freq * b[m - 1 - i]; // b = tmp; y = x; // } else { // for (int i = 0; i < m; i++) c[l - 1 - i] -= freq * b[m - 1 - i]; // } // } // reverse(begin(c), end(c)); // return c; } Mod998 bostanMori(std::vector num, std::vector den, long long n) { while (n > 0) { // den_neg = den with odd coefficients negated std::vector den_neg = den; for (size_t i = 0; i < den_neg.size(); ++i) { if (i % 2 == 1) den_neg[i] = Mod998(0) - den_neg[i]; } // f2 = num * den_neg // g2 = den * den_neg std::vector f2 = Convolve998(num, den_neg); std::vector g2 = Convolve998(den, den_neg); std::vector num2, den2; // pick even or odd coefficients depending on parity of n if (n % 2 == 0) { for (size_t i = 0; i < f2.size(); i += 2) num2.push_back(f2[i]); } else { for (size_t i = 1; i < f2.size(); i += 2) num2.push_back(f2[i]); } for (size_t i = 0; i < g2.size(); i += 2) den2.push_back(g2[i]); num = std::move(num2); den = std::move(den2); n /= 2; } return num[0] * den[0].inv(); } Mod998 LinearRecurrence(vector a, vector c, ll k) { int n=c.size(); if(n==0) return 0; vector dnm(n+1); dnm[0]=1; rep(i,n) dnm[i+1]=-c[i]; a.resize(n,0); auto num=Convolve998(dnm,a); if(num.size()>n) num.resize(n); // return FPS::BostanMori(k,num,dnm); return bostanMori(num,dnm,k); } Mod998 BMBM(const vector &s, ll n) { auto bm=BerlekampMassey(s); return LinearRecurrence(s,bm,n); } //---------------------------------------------------------- void solve() { ll K,L,R; cin>>K>>L>>R; ll N=500; vector A(N+1); A[0]=1; rep(i,N) A[i+1]=A[i]*K+Mod998(i).pow(K)+Mod998(K).pow(i); vector B(N+2); rep(i,N+1) B[i+1]=B[i]+A[i]; cout<>T; while(T--) solve(); }