Number of People Aware of a Secret

medium queue dp simulation

Problem

On day 1 a single person discovers a secret. Starting delay days after learning it, each person tells the secret to exactly one brand-new person every day — until forget days after learning it, at which point they forget it entirely and stop sharing (someone who forgot may even be told again later).

Given n, delay, and forget, return how many people still know the secret at the end of day n, modulo 10⁹ + 7.

Inputn = 6, delay = 2, forget = 4
Output5
New learners per day are 1, 0, 1, 1, 1, 2; the day-1 discoverer forgets on day 5, so 1 + 1 + 1 + 2 = 5 people still know the secret.

def people_aware_of_secret(n, delay, forget):
    MOD = 10 ** 9 + 7
    dp = [0] * (n + 1)   # dp[d] = people who first learn on day d
    dp[1] = 1
    sharers = 0          # cohorts currently inside the sharing window
    for day in range(2, n + 1):
        if day - delay >= 1:
            sharers = (sharers + dp[day - delay]) % MOD   # joins queue
        if day - forget >= 1:
            sharers = (sharers - dp[day - forget]) % MOD  # forgets
        dp[day] = sharers
    return sum(dp[n - forget + 1:]) % MOD
function peopleAwareOfSecret(n, delay, forget) {
  const MOD = 1000000007;
  const dp = new Array(n + 1).fill(0); // dp[d] = new learners on day d
  dp[1] = 1;
  let sharers = 0; // cohorts currently inside the sharing window
  for (let day = 2; day <= n; day++) {
    if (day - delay >= 1) sharers = (sharers + dp[day - delay]) % MOD;
    if (day - forget >= 1) sharers = (sharers - dp[day - forget] + MOD) % MOD;
    dp[day] = sharers;
  }
  let total = 0;
  for (let d = n - forget + 1; d <= n; d++) total = (total + dp[d]) % MOD;
  return total;
}
int peopleAwareOfSecret(int n, int delay, int forget) {
    final int MOD = 1_000_000_007;
    long[] dp = new long[n + 1]; // dp[d] = new learners on day d
    dp[1] = 1;
    long sharers = 0; // cohorts currently inside the sharing window
    for (int day = 2; day <= n; day++) {
        if (day - delay >= 1) sharers = (sharers + dp[day - delay]) % MOD;
        if (day - forget >= 1) sharers = (sharers - dp[day - forget] + MOD) % MOD;
        dp[day] = sharers;
    }
    long total = 0;
    for (int d = n - forget + 1; d <= n; d++) total = (total + dp[d]) % MOD;
    return (int) total;
}
int peopleAwareOfSecret(int n, int delay, int forget) {
    const long long MOD = 1000000007;
    vector<long long> dp(n + 1, 0); // dp[d] = new learners on day d
    dp[1] = 1;
    long long sharers = 0; // cohorts currently inside the sharing window
    for (int day = 2; day <= n; day++) {
        if (day - delay >= 1) sharers = (sharers + dp[day - delay]) % MOD;
        if (day - forget >= 1) sharers = (sharers - dp[day - forget] + MOD) % MOD;
        dp[day] = sharers;
    }
    long long total = 0;
    for (int d = n - forget + 1; d <= n; d++) total = (total + dp[d]) % MOD;
    return (int) total;
}
Time: O(n) Space: O(n)