解题思路
设前缀和为 s ,那么有
a
i
=
k
i
s
i
−
1
,
s
i
=
s
i
−
1
+
a
i
=
s
i
−
1
+
k
i
s
i
−
1
=
i
+
k
i
s
i
−
1
a_i=\frac{k}{i}s_{i-1} , s_i=s_{i-1}+a_i=s_{i-1}+\frac{k}{i}s_{i-1}=\frac{i+k}{i}s_{i-1}
ai=iksi−1,si=si−1+ai=si−1+iksi−1=ii+ksi−1
然后不难发现答案
s n = ∏ i = 1 n k + i i = C n + k − 1 n s_n=\prod_{i=1}^n\frac{k+i}{i}=C_{n+k-1}^{n} sn=∏i=1nik+i=Cn+k−1n
线性预处理逆元和阶乘就好了。
时间复杂度:O(n+T)O(n+T)
代码
#include<iostream>
#include<cstdio>
#include<iomanip>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<queue>
#define ll long long
using namespace std;
const ll mod=1e9+7;
int T;
ll n,k,in[10000010],sum;
ll ksm(ll a,ll b)
{
ll ans=1,base=a;
while(b)
{
if(b&1)
ans=(ans*base)%mod;
base=(base*base)%mod;
b>>=1;
}
return ans;
}
int main(){
scanf("%d",&T);
in[1]=1,in[0]=1;
for(ll i=2;i<=10000000;i++)
{
in[i]=in[i-1]*i%mod;
}
while(T--)
{
scanf("%lld%lld",&n,&k);
ll x=in[n+k-1]*ksm(in[k-1],mod-2)%mod;
x=x*ksm(in[n],mod-2)%mod;
printf("%lld\n",x);
}
}