bouzuya/tsukota v0.3.2 をつくった。
- copyright の表記の誤りの修正
- ActivityIndicator の漏れの修正
軽微な修正でお茶をにごしている。
上の子の自転車の練習を手伝う。もう直線なら普通に進める。
問題はこぎはじめ。ペダルだけで動こうとするので厳しそう。
あとはスピードが怖いようで、すぐに足をつけようとする。余計に危ないのに……。
本当にあとは慣れという感じ。
- Digit Sum (Educational DP Contest:S問題)
https://atcoder.jp/contests/dp/tasks/dp_s
- https://atcoder.jp/contests/dp/submissions/43224011
- 桁 DP
- 桁 DP の基本形
dp[i][j] := そこまでの剰余が i で K 未満が確定しているなら j = 1 のときの場合の数
dp[0][0] = 1
からはじめる- 上位桁から順に各桁を走査する
0..=d
で各 i について0..=9
でその桁の各数字を走査する- その桁の数字で未満が確定するかしないかで分岐する
- 1 以上の、なので最後に 1 を引く
use proconio::{input, marker::Chars}; fn main() { input! { k: Chars, d: usize, } let modp = 1_000_000_007_usize; let mut dp = vec![vec![0_usize; 2]; d + 1]; dp[0][0] = 1; for k_i in k.iter().copied() { let mut next = vec![vec![0_usize; 2]; d + 1]; let k_i = (k_i as u8 - b'0') as usize; for j in 0..=d { for l in 0..=9 { let nj = (j + l) % d; next[nj][1] += dp[j][1]; next[nj][1] %= modp; match l.cmp(&k_i) { std::cmp::Ordering::Less => { next[nj][1] += dp[j][0]; next[nj][1] %= modp; } std::cmp::Ordering::Equal => { next[nj][0] += dp[j][0]; next[nj][0] %= modp; } std::cmp::Ordering::Greater => { // do nothing } } } } dp = next; } let ans = (dp[0][0] + dp[0][1] + modp - 1) % modp; println!("{}", ans); }
今日のコミット。