Initially, you start with an array a of n integers where a[i] = 1 for all 0 <= i <= n - 1. After each second, you simultaneously update each element to be the sum of all its preceding elements plus the element itself.
For example, after one second, a[0] remains the same, a[1] becomes a[0] + a[1], a[2] becomes a[0] + a[1] + a[2], and so on.
Return the value of a[n - 1] after k seconds.
Since the answer may be very large, return it modulo10^9 + 7.
After each second, the update rule is equivalent to prefix sums. The value at the end, a[n-1], after k seconds, is the number of ways to distribute k indistinguishable increments among n positions, which is a classic stars and bars problem. The answer is C(n+k-1, n-1).
classSolution {
publicintnthValueAfterKSeconds(int n, int k) {
int MOD = 1_000_000_007;
long[] fact =newlong[n+k];
long[] inv =newlong[n+k];
fact[0]=1;
for(int i=1;i<n+k;++i) fact[i]=fact[i-1]*i%MOD;
inv[n+k-1]=1;
for(int i=n+k-2;i>=0;--i) inv[i]=inv[i+1]*(i+1)%MOD;
return (int)(fact[n+k-1]*inv[n-1]%MOD*inv[k]%MOD);
}
}
1
2
3
4
5
6
7
8
9
10
11
classSolution {
funnthValueAfterKSeconds(n: Int, k: Int): Int {
val MOD = 1_000_000_007
val fact = LongArray(n+k){1}
val inv = LongArray(n+k){1}
for(i in1 until n+k) fact[i]=fact[i-1]*i%MOD
inv[n+k-1]=1for(i in n+k-2 downTo 0) inv[i]=inv[i+1]*(i+1)%MOD
return (fact[n+k-1]*inv[n-1]%MOD*inv[k]%MOD).toInt()
}
}
1
2
3
4
5
6
7
8
9
10
11
classSolution:
defnthValueAfterKSeconds(self, n: int, k: int) -> int:
MOD =10**9+7 fact = [1]*(n+k)
for i in range(1, n+k):
fact[i] = fact[i-1]*i%MOD
inv = [1]*(n+k)
inv[-1] = pow(fact[-1], MOD-2, MOD)
for i in range(n+k-2, -1, -1):
inv[i] = inv[i+1]*(i+1)%MOD
return fact[n+k-1]*inv[n-1]%MOD*inv[k]%MOD
impl Solution {
pubfnnth_value_after_k_seconds(n: i32, k: i32) -> i32 {
constMOD: i64=1_000_000_007;
let n = n asusize; let k = k asusize;
letmut fact =vec![1i64; n+k];
for i in1..n+k { fact[i] = fact[i-1]*i asi64%MOD; }
letmut inv =vec![1i64; n+k];
inv[n+k-1] = pow(fact[n+k-1], MOD-2, MOD);
for i in (0..n+k-1).rev() { inv[i] = inv[i+1]*(i asi64+1)%MOD; }
(fact[n+k-1]*inv[n-1]%MOD*inv[k]%MOD) asi32 }
}
fnpow(mut a: i64, mut b: i64, m: i64) -> i64 {
letmut r =1;
while b >0 {
if b&1==1 { r = r*a%m; }
a = a*a%m; b >>=1;
}
r
}