解説

InI_n の値を直接求めることは難しいです。そのため、次の漸化式を考えます。

=[xn+1(ex)]01+(n+1)01xnexdx= [x^{n+1}(-e^{-x})]^{1}_{0}+(n+1)\int_{0}^{1}{x^ne^{-x}dx} =e1+(n+1)In\displaystyle =-e^{-1}+(n+1)I_n

この漸化式を利用して答えの値を求めても良いですが、ここでは数式変形による工夫を考えていきます。

In+1=e1+(n+1)In\displaystyle I_{n+1} =-e^{-1}+(n+1)I_n In+1(n+1)!=e1(n+1)!+Inn!\displaystyle \frac{I_{n+1}}{(n+1)!} =\frac{-e^{-1}}{(n+1)!}+\frac{I_n}{n!}

ここで、xn=Inn!,c=e1(n+1)!\displaystyle x_n = \frac{I_{n}}{n!},c =\frac{-e^{-1}}{(n+1)!} とおくと、xn+1=c+xn\displaystyle x_{n+1} = c + x_n より、

xn={x0+k=0n1e1(k+1)!(n1)x0(n=0)\begin{aligned} x_n = \begin{cases} x_0+\displaystyle\sum_{k=0}^{n-1}\frac{-e^{-1}}{(k+1)!} & (n \ge 1) \\ x_0 & (n = 0) \end{cases} \end{aligned}

xn=x0e1k=1n1k!x_n=\displaystyle x_0-e^{-1}\sum^{n}_{k=1}{\frac{1}{k!}}

ここで、 x0=I00!=e1+1\displaystyle x_0 = \frac{I_0}{0!} = -e^{-1}+1 であるから、

Inn!=(e1+1)e1k=1n1k!=1e1k=0n1k!\displaystyle \frac{I_n}{n!}= (-e^{-1}+1)-e^{-1}\sum^{n}_{k=1}{\frac{1}{k!}} = 1-e^{-1}\sum^{n}_{k=0}{\frac{1}{k!}} In=n!(1e1k=0n1k!)=n!e1k=0nn!k!\displaystyle I_n= n!({1-e^{-1}\sum^{n}_{k=0}{\frac{1}{k!}}}) = n! - e^{-1}\sum^{n}_{k=0}{\frac{n!}{k!}}

よって、a=k=0nn!k!,b=n!\displaystyle a=-\sum^{n}_{k=0}{\frac{n!}{k!}},b=n! です。

ここで、k=0nn!k!\displaystyle\sum^{n}_{k=0}{\frac{n!}{k!}} の値を高速に求めることを考えます。この値を SnS_n とします。ここで、 Sn+1=k=0n+1(n+1)!k!=(n+1)k=0nn!k!+(n+1)!(n+1)!=(n+1)Sn+1\displaystyle S_{n+1} = \sum^{n+1}_{k=0}{\frac{(n+1)!}{k!}} = (n+1)\sum^{n}_{k=0}{\frac{n!}{k!}}+\frac{(n+1)!}{(n+1)!} = (n+1)S_n+1 であり、この漸化式から S0S_0 から SnS_n までの値はO(N)O(N) で前計算できます。0!0! から n!n! の値もO(N)O(N) で前計算できるので、全体として計算量は O(N+Q)O(N+Q) となり、実行時間制限に間に合います。

追記

a,ba,b の値を

In+1=e1+(n+1)In\displaystyle I_{n+1}=-e^{-1}+(n+1)I_n

を用いて計算してみます。ここで、InI_na,ba,b の値を

(anbn)\left( \begin{array}{c} a_n \\ b_n \\ \end{array} \right)

という風にベクトルと行列で表現すると、

(an+1bn+1)=(n+100n+1)(anbn)+(10)\left( \begin{array}{c} a_{n+1} \\ b_{n+1} \\ \end{array} \right) = \begin{pmatrix} n+1 & 0 \\ 0 & n+1 \end{pmatrix} \left( \begin{array}{c} a_{n} \\ b_{n} \\ \end{array} \right)+ \left( \begin{array}{c} -1 \\ 0 \\ \end{array} \right)

となります。これをそのまま前計算に利用することでも計算量 O(N+Q)O(N+Q) を達成できます。(なんなら an,bna_n,b_n に分解できるので、こっちのほうがかなり楽です。)