comments | difficulty | edit_url | tags | |||
---|---|---|---|---|---|---|
true |
Hard |
|
You are given three integers n
, x
, and y
.
An event is being held for n
performers. When a performer arrives, they are assigned to one of the x
stages. All performers assigned to the same stage will perform together as a band, though some stages might remain empty.
After all performances are completed, the jury will award each band a score in the range [1, y]
.
Return the total number of possible ways the event can take place.
Since the answer may be very large, return it modulo 109 + 7
.
Note that two events are considered to have been held differently if either of the following conditions is satisfied:
- Any performer is assigned a different stage.
- Any band is awarded a different score.
Example 1:
Input: n = 1, x = 2, y = 3
Output: 6
Explanation:
- There are 2 ways to assign a stage to the performer.
- The jury can award a score of either 1, 2, or 3 to the only band.
Example 2:
Input: n = 5, x = 2, y = 1
Output: 32
Explanation:
- Each performer will be assigned either stage 1 or stage 2.
- All bands will be awarded a score of 1.
Example 3:
Input: n = 3, x = 3, y = 4
Output: 684
Constraints:
1 <= n, x, y <= 1000
We define
For
- If the performer is assigned to a program that already has performers, there are
$j$ choices, i.e.,$f[i - 1][j] \times j$ ; - If the performer is assigned to a program that has no performers, there are
$x - (j - 1)$ choices, i.e.,$f[i - 1][j - 1] \times (x - (j - 1))$ .
So the state transition equation is:
For each
Note that since the answer can be very large, we need to take the modulo
The time complexity is
class Solution:
def numberOfWays(self, n: int, x: int, y: int) -> int:
mod = 10**9 + 7
f = [[0] * (x + 1) for _ in range(n + 1)]
f[0][0] = 1
for i in range(1, n + 1):
for j in range(1, x + 1):
f[i][j] = (f[i - 1][j] * j + f[i - 1][j - 1] * (x - (j - 1))) % mod
ans, p = 0, 1
for j in range(1, x + 1):
p = p * y % mod
ans = (ans + f[n][j] * p) % mod
return ans
class Solution {
public int numberOfWays(int n, int x, int y) {
final int mod = (int) 1e9 + 7;
long[][] f = new long[n + 1][x + 1];
f[0][0] = 1;
for (int i = 1; i <= n; ++i) {
for (int j = 1; j <= x; ++j) {
f[i][j] = (f[i - 1][j] * j % mod + f[i - 1][j - 1] * (x - (j - 1) % mod)) % mod;
}
}
long ans = 0, p = 1;
for (int j = 1; j <= x; ++j) {
p = p * y % mod;
ans = (ans + f[n][j] * p) % mod;
}
return (int) ans;
}
}
class Solution {
public:
int numberOfWays(int n, int x, int y) {
const int mod = 1e9 + 7;
long long f[n + 1][x + 1];
memset(f, 0, sizeof(f));
f[0][0] = 1;
for (int i = 1; i <= n; ++i) {
for (int j = 1; j <= x; ++j) {
f[i][j] = (f[i - 1][j] * j % mod + f[i - 1][j - 1] * (x - (j - 1) % mod)) % mod;
}
}
long long ans = 0, p = 1;
for (int j = 1; j <= x; ++j) {
p = p * y % mod;
ans = (ans + f[n][j] * p) % mod;
}
return ans;
}
};
func numberOfWays(n int, x int, y int) int {
const mod int = 1e9 + 7
f := make([][]int, n+1)
for i := range f {
f[i] = make([]int, x+1)
}
f[0][0] = 1
for i := 1; i <= n; i++ {
for j := 1; j <= x; j++ {
f[i][j] = (f[i-1][j]*j%mod + f[i-1][j-1]*(x-(j-1))%mod) % mod
}
}
ans, p := 0, 1
for j := 1; j <= x; j++ {
p = p * y % mod
ans = (ans + f[n][j]*p%mod) % mod
}
return ans
}
function numberOfWays(n: number, x: number, y: number): number {
const mod = BigInt(10 ** 9 + 7);
const f: bigint[][] = Array.from({ length: n + 1 }, () => Array(x + 1).fill(0n));
f[0][0] = 1n;
for (let i = 1; i <= n; ++i) {
for (let j = 1; j <= x; ++j) {
f[i][j] = (f[i - 1][j] * BigInt(j) + f[i - 1][j - 1] * BigInt(x - (j - 1))) % mod;
}
}
let [ans, p] = [0n, 1n];
for (let j = 1; j <= x; ++j) {
p = (p * BigInt(y)) % mod;
ans = (ans + f[n][j] * p) % mod;
}
return Number(ans);
}