解説
In の値を直接求めることは難しいです。そのため、次の漸化式を考えます。
=[xn+1(−e−x)]01+(n+1)∫01xne−xdx
=−e−1+(n+1)In
この漸化式を利用して答えの値を求めても良いですが、ここでは数式変形による工夫を考えていきます。
In+1=−e−1+(n+1)In
(n+1)!In+1=(n+1)!−e−1+n!In
ここで、xn=n!In,c=(n+1)!−e−1 とおくと、xn+1=c+xn より、
xn=⎩⎨⎧x0+k=0∑n−1(k+1)!−e−1x0(n≥1)(n=0)
xn=x0−e−1k=1∑nk!1
ここで、 x0=0!I0=−e−1+1 であるから、
n!In=(−e−1+1)−e−1k=1∑nk!1=1−e−1k=0∑nk!1
In=n!(1−e−1k=0∑nk!1)=n!−e−1k=0∑nk!n!
よって、a=−k=0∑nk!n!,b=n! です。
ここで、k=0∑nk!n! の値を高速に求めることを考えます。この値を Sn
とします。ここで、
Sn+1=k=0∑n+1k!(n+1)!=(n+1)k=0∑nk!n!+(n+1)!(n+1)!=(n+1)Sn+1 であり、この漸化式から S0 から Sn までの値はO(N) で前計算できます。0! から n! の値もO(N) で前計算できるので、全体として計算量は O(N+Q) となり、実行時間制限に間に合います。
追記
a,b の値を
In+1=−e−1+(n+1)In
を用いて計算してみます。ここで、In の a,b の値を
(anbn)
という風にベクトルと行列で表現すると、
(an+1bn+1)=(n+100n+1)(anbn)+(−10)
となります。これをそのまま前計算に利用することでも計算量 O(N+Q) を達成できます。(なんなら an,bn に分解できるので、こっちのほうがかなり楽です。)