返回介绍

solution / 2300-2399 / 2338.Count the Number of Ideal Arrays / README_EN

发布于 2024-06-17 01:03:07 字数 9731 浏览 0 评论 0 收藏 0

2338. Count the Number of Ideal Arrays

中文文档

Description

You are given two integers n and maxValue, which are used to describe an ideal array.

A 0-indexed integer array arr of length n is considered ideal if the following conditions hold:

  • Every arr[i] is a value from 1 to maxValue, for 0 <= i < n.
  • Every arr[i] is divisible by arr[i - 1], for 0 < i < n.

Return _the number of distinct ideal arrays of length _n. Since the answer may be very large, return it modulo 109 + 7.

 

Example 1:

Input: n = 2, maxValue = 5
Output: 10
Explanation: The following are the possible ideal arrays:
- Arrays starting with the value 1 (5 arrays): [1,1], [1,2], [1,3], [1,4], [1,5]
- Arrays starting with the value 2 (2 arrays): [2,2], [2,4]
- Arrays starting with the value 3 (1 array): [3,3]
- Arrays starting with the value 4 (1 array): [4,4]
- Arrays starting with the value 5 (1 array): [5,5]
There are a total of 5 + 2 + 1 + 1 + 1 = 10 distinct ideal arrays.

Example 2:

Input: n = 5, maxValue = 3
Output: 11
Explanation: The following are the possible ideal arrays:
- Arrays starting with the value 1 (9 arrays): 
   - With no other distinct values (1 array): [1,1,1,1,1] 
   - With 2nd distinct value 2 (4 arrays): [1,1,1,1,2], [1,1,1,2,2], [1,1,2,2,2], [1,2,2,2,2]
   - With 2nd distinct value 3 (4 arrays): [1,1,1,1,3], [1,1,1,3,3], [1,1,3,3,3], [1,3,3,3,3]
- Arrays starting with the value 2 (1 array): [2,2,2,2,2]
- Arrays starting with the value 3 (1 array): [3,3,3,3,3]
There are a total of 9 + 1 + 1 = 11 distinct ideal arrays.

 

Constraints:

  • 2 <= n <= 104
  • 1 <= maxValue <= 104

Solutions

Solution 1

class Solution:
  def idealArrays(self, n: int, maxValue: int) -> int:
    @cache
    def dfs(i, cnt):
      res = c[-1][cnt - 1]
      if cnt < n:
        k = 2
        while k * i <= maxValue:
          res = (res + dfs(k * i, cnt + 1)) % mod
          k += 1
      return res

    c = [[0] * 16 for _ in range(n)]
    mod = 10**9 + 7
    for i in range(n):
      for j in range(min(16, i + 1)):
        c[i][j] = 1 if j == 0 else (c[i - 1][j] + c[i - 1][j - 1]) % mod
    ans = 0
    for i in range(1, maxValue + 1):
      ans = (ans + dfs(i, 1)) % mod
    return ans
class Solution {
  private int[][] f;
  private int[][] c;
  private int n;
  private int m;
  private static final int MOD = (int) 1e9 + 7;

  public int idealArrays(int n, int maxValue) {
    this.n = n;
    this.m = maxValue;
    this.f = new int[maxValue + 1][16];
    for (int[] row : f) {
      Arrays.fill(row, -1);
    }
    c = new int[n][16];
    for (int i = 0; i < n; ++i) {
      for (int j = 0; j <= i && j < 16; ++j) {
        c[i][j] = j == 0 ? 1 : (c[i - 1][j] + c[i - 1][j - 1]) % MOD;
      }
    }
    int ans = 0;
    for (int i = 1; i <= m; ++i) {
      ans = (ans + dfs(i, 1)) % MOD;
    }
    return ans;
  }

  private int dfs(int i, int cnt) {
    if (f[i][cnt] != -1) {
      return f[i][cnt];
    }
    int res = c[n - 1][cnt - 1];
    if (cnt < n) {
      for (int k = 2; k * i <= m; ++k) {
        res = (res + dfs(k * i, cnt + 1)) % MOD;
      }
    }
    f[i][cnt] = res;
    return res;
  }
}
class Solution {
public:
  int m, n;
  const int mod = 1e9 + 7;
  vector<vector<int>> f;
  vector<vector<int>> c;

  int idealArrays(int n, int maxValue) {
    this->m = maxValue;
    this->n = n;
    f.assign(maxValue + 1, vector<int>(16, -1));
    c.assign(n, vector<int>(16, 0));
    for (int i = 0; i < n; ++i)
      for (int j = 0; j <= i && j < 16; ++j)
        c[i][j] = !j ? 1 : (c[i - 1][j] + c[i - 1][j - 1]) % mod;
    int ans = 0;
    for (int i = 1; i <= m; ++i) ans = (ans + dfs(i, 1)) % mod;
    return ans;
  }

  int dfs(int i, int cnt) {
    if (f[i][cnt] != -1) return f[i][cnt];
    int res = c[n - 1][cnt - 1];
    if (cnt < n)
      for (int k = 2; k * i <= m; ++k)
        res = (res + dfs(k * i, cnt + 1)) % mod;
    f[i][cnt] = res;
    return res;
  }
};
func idealArrays(n int, maxValue int) int {
  mod := int(1e9) + 7
  m := maxValue
  c := make([][]int, n)
  f := make([][]int, m+1)
  for i := range c {
    c[i] = make([]int, 16)
  }
  for i := range f {
    f[i] = make([]int, 16)
    for j := range f[i] {
      f[i][j] = -1
    }
  }
  var dfs func(int, int) int
  dfs = func(i, cnt int) int {
    if f[i][cnt] != -1 {
      return f[i][cnt]
    }
    res := c[n-1][cnt-1]
    if cnt < n {
      for k := 2; k*i <= m; k++ {
        res = (res + dfs(k*i, cnt+1)) % mod
      }
    }
    f[i][cnt] = res
    return res
  }
  for i := 0; i < n; i++ {
    for j := 0; j <= i && j < 16; j++ {
      if j == 0 {
        c[i][j] = 1
      } else {
        c[i][j] = (c[i-1][j] + c[i-1][j-1]) % mod
      }
    }
  }
  ans := 0
  for i := 1; i <= m; i++ {
    ans = (ans + dfs(i, 1)) % mod
  }
  return ans
}

Solution 2

class Solution:
  def idealArrays(self, n: int, maxValue: int) -> int:
    c = [[0] * 16 for _ in range(n)]
    mod = 10**9 + 7
    for i in range(n):
      for j in range(min(16, i + 1)):
        c[i][j] = 1 if j == 0 else (c[i - 1][j] + c[i - 1][j - 1]) % mod
    dp = [[0] * 16 for _ in range(maxValue + 1)]
    for i in range(1, maxValue + 1):
      dp[i][1] = 1
    for j in range(1, 15):
      for i in range(1, maxValue + 1):
        k = 2
        while k * i <= maxValue:
          dp[k * i][j + 1] = (dp[k * i][j + 1] + dp[i][j]) % mod
          k += 1
    ans = 0
    for i in range(1, maxValue + 1):
      for j in range(1, 16):
        ans = (ans + dp[i][j] * c[-1][j - 1]) % mod
    return ans
class Solution {
  private static final int MOD = (int) 1e9 + 7;

  public int idealArrays(int n, int maxValue) {
    int[][] c = new int[n][16];
    for (int i = 0; i < n; ++i) {
      for (int j = 0; j <= i && j < 16; ++j) {
        c[i][j] = j == 0 ? 1 : (c[i - 1][j] + c[i - 1][j - 1]) % MOD;
      }
    }
    long[][] dp = new long[maxValue + 1][16];
    for (int i = 1; i <= maxValue; ++i) {
      dp[i][1] = 1;
    }
    for (int j = 1; j < 15; ++j) {
      for (int i = 1; i <= maxValue; ++i) {
        int k = 2;
        for (; k * i <= maxValue; ++k) {
          dp[k * i][j + 1] = (dp[k * i][j + 1] + dp[i][j]) % MOD;
        }
      }
    }
    long ans = 0;
    for (int i = 1; i <= maxValue; ++i) {
      for (int j = 1; j < 16; ++j) {
        ans = (ans + dp[i][j] * c[n - 1][j - 1]) % MOD;
      }
    }
    return (int) ans;
  }
}
using ll = long long;

class Solution {
public:
  const int mod = 1e9 + 7;

  int idealArrays(int n, int maxValue) {
    vector<vector<int>> c(n, vector<int>(16));
    for (int i = 0; i < n; ++i)
      for (int j = 0; j <= i && j < 16; ++j)
        c[i][j] = j == 0 ? 1 : (c[i - 1][j] + c[i - 1][j - 1]) % mod;
    vector<vector<ll>> dp(maxValue + 1, vector<ll>(16));
    for (int i = 1; i <= maxValue; ++i) dp[i][1] = 1;
    for (int j = 1; j < 15; ++j) {
      for (int i = 1; i <= maxValue; ++i) {
        int k = 2;
        for (; k * i <= maxValue; ++k) dp[k * i][j + 1] = (dp[k * i][j + 1] + dp[i][j]) % mod;
      }
    }
    ll ans = 0;
    for (int i = 1; i <= maxValue; ++i)
      for (int j = 1; j < 16; ++j)
        ans = (ans + dp[i][j] * c[n - 1][j - 1]) % mod;
    return (int) ans;
  }
};
func idealArrays(n int, maxValue int) int {
  mod := int(1e9) + 7
  c := make([][]int, n)
  for i := range c {
    c[i] = make([]int, 16)
  }
  for i := 0; i < n; i++ {
    for j := 0; j <= i && j < 16; j++ {
      if j == 0 {
        c[i][j] = 1
      } else {
        c[i][j] = (c[i-1][j] + c[i-1][j-1]) % mod
      }
    }
  }
  dp := make([][]int, maxValue+1)
  for i := range dp {
    dp[i] = make([]int, 16)
    dp[i][1] = 1
  }
  for j := 1; j < 15; j++ {
    for i := 1; i <= maxValue; i++ {
      k := 2
      for ; k*i <= maxValue; k++ {
        dp[k*i][j+1] = (dp[k*i][j+1] + dp[i][j]) % mod
      }
    }
  }
  ans := 0
  for i := 1; i <= maxValue; i++ {
    for j := 1; j < 16; j++ {
      ans = (ans + dp[i][j]*c[n-1][j-1]) % mod
    }
  }
  return ans
}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文