結果
| 問題 |
No.1667 Forest
|
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2022-10-04 00:35:45 |
| 言語 | Rust (1.83.0 + proconio) |
| 結果 |
AC
|
| 実行時間 | 768 ms / 3,000 ms |
| コード長 | 1,685 bytes |
| コンパイル時間 | 14,969 ms |
| コンパイル使用メモリ | 379,312 KB |
| 実行使用メモリ | 5,248 KB |
| 最終ジャッジ日時 | 2024-12-28 06:36:45 |
| 合計ジャッジ時間 | 21,182 ms |
|
ジャッジサーバーID (参考情報) |
judge3 / judge4 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 |
| other | AC * 15 |
コンパイルメッセージ
warning: variable `MOD` should have a snake case name
--> src/main.rs:2:37
|
2 | fn power(base: usize, times: usize, MOD: usize) -> usize {
| ^^^
|
= note: `#[warn(non_snake_case)]` on by default
help: rename the identifier or convert it to a snake case raw identifier
|
2 | fn power(base: usize, times: usize, r#mod: usize) -> usize {
| ~~~~~
warning: variable `MOD` should have a snake case name
--> src/main.rs:9:26
|
9 | fn fact_inv(size: usize, MOD: usize) -> (Vec<usize>, Vec<usize>) {
| ^^^
|
help: rename the identifier or convert it to a snake case raw identifier
|
9 | fn fact_inv(size: usize, r#mod: usize) -> (Vec<usize>, Vec<usize>) {
| ~~~~~
warning: variable `MOD` should have a snake case name
--> src/main.rs:26:73
|
26 | fn comb(n: usize, r: usize, facts: &Vec<usize>, fact_invs: &Vec<usize>, MOD: usize) -> usize {
| ^^^
|
help: rename the identifier or convert it to a snake case raw identifier
|
26 | fn comb(n: usize, r: usize, facts: &Vec<usize>, fact_invs: &Vec<usize>, r#mod: usize) -> usize {
| ~~~~~
warning: variable `MOD` should have a snake case name
--> src/main.rs:35:9
|
35 | let MOD = temp[1];
| ^^^
|
help: rename the identifier or convert it to a snake case raw identifier
|
35 | let r#mod = temp[1];
| ~~~~~
ソースコード
fn power(base: usize, times: usize, MOD: usize) -> usize {
if times == 0 { return 1usize; }
if times == 1 { return base; }
let temp = power(base, times/2, MOD);
temp * temp % MOD * power(base, times%2, MOD) % MOD
}
fn fact_inv(size: usize, MOD: usize) -> (Vec<usize>, Vec<usize>) {
let mut facts = vec![0usize; size+1];
let mut fact_invs = vec![0usize; size+1];
let mut invs = vec![0usize; size+1];
facts[0] = 1;
facts[1] = 1;
fact_invs[0] = 1;
fact_invs[1] = 1;
invs[1] = 1;
for i in 2..=size {
facts[i] = facts[i-1] * i % MOD;
invs[i] = MOD - invs[MOD % i] * (MOD / i) % MOD;
fact_invs[i] = fact_invs[i - 1] * invs[i] % MOD;
}
(facts, fact_invs)
}
fn comb(n: usize, r: usize, facts: &Vec<usize>, fact_invs: &Vec<usize>, MOD: usize) -> usize {
facts[n] * fact_invs[r] % MOD * fact_invs[n-r] % MOD
}
fn main() {
let mut temp = String::new();
std::io::stdin().read_line(&mut temp).ok();
let temp: Vec<usize> = temp.trim().split_whitespace().map(|s| s.parse().unwrap()).collect();
let n = temp[0];
let MOD = temp[1];
let (facts, fact_invs) = fact_inv(1000, MOD);
let mut dp = vec![vec![0usize; n]; n+1];
dp[0][0] = 1;
for i in 0..n {
for j in 0..=i {
dp[i+1][j] += dp[i][j];
dp[i+1][j] %= MOD;
for k in 2..=n {
if k+j-1 >= n || i+k > n { break; }
dp[i+k][j+k-1] += dp[i][j] * comb(n-1-i, k-1, &facts, &fact_invs, MOD) % MOD * power(k, k-2, MOD) % MOD;
dp[i+k][j+k-1] %= MOD;
}
}
}
for i in 0..n {
println!("{}", dp[n][i]);
}
}