数え上げ問題と簡単な解法をまとめる.
「で割った余りを求めよ」などはいちいち書かないので答えが大きくなるなら余りを求めると考えてもらっていい.
目次
- yukicoder No.118 門松列(2)
- yukicoder No.346 チワワ数え上げ問題
- Educational Codeforces#94 D Zigzags
- yukicoder No.584 赤、緑、青の色塗り
- yukicoder No.794 チーム戦 (2)
- yukicoder No.802 だいたい等差数列
- yukicoder No.1044 正直者大学
- yukicoder No.3046 yukicoderの過去問
- ABC180 F - Unbranched
- ABC172 E - NEQ
- ABC167 E - Colorful Blocks
- ABC163 F - path pass i
- ABC158 E - Divisible Substring
- ABC160 F - Distributing Integers
- ABC147 F - Sum Difference
- ABC146 E - Rem of Sum is Num
- ABC138 F - Coincidence
- ABC135 D - Digits Parade
- ABC134 F - Permutation Oddness
- ABC133 E - Virus Tree 2
- ABC132 F - Small Products
- ABC130 E - Common Subsequence
- ABC129 E - Sum Equals Xor
- ABC110 D - Factorization
- ABC104 D - We Love ABC
- ABC098 D - Xor Sum 2
- ABC077 D - 11
- ABC050 D - Xor Sum
- ARC110 D - Binomial Coefficient is Fun
- ARC106 D - Powers
- ABC173 F - Intervals on Tree
- ABC169 F - Knapsack for All Subsets
- ABC162 E - Sum of gcd of Tuples (Hard)
- ABC159 F - Knapsack for All Segments
- ABC158 F - Removing Robots
- ABC154 F - Many Many Paths
- ABC150 E - Change a Little Bit
- ABC140 E - Second Sum
- ABC136 F - Enclosed Points
- ABC127 E - Cell Distance
- ABC127 E - Cell Distance
- ARC102 E - Stop. Otherwise...
- ARC101 E - Ribbons on Tree
- yukicoder No.1321 塗るめた
yukicoder No.346 チワワ数え上げ問題
問題概要
文字列が与えられる.
の部分文字列(連続でなくてもよいが順序は保つ)のうち, "cww"となるものの数を求めよ.
解法
)取る場合の常套手段として真ん中を固定するものがある.
今回は真ん中の'w'を固定してそれより左の'c'の数と右の'w'の数の積をすべての'w'に対して足し合わせたものが答えとなる.
Educational Codeforces#94 D Zigzags
問題概要
長さの数列
が与えられる.
となるような
の組の数を求めよ.
解法
真ん中を固定する. を固定すると,
かつ
となる
の数と
かつ
となる
の数の積が答えとなる. 累積和をとっておくことで
で求められる. すべての
について和をとったものが答え.
yukicoder No.584 赤、緑、青の色塗り
問題概要
連続したマスを三色で塗る. 赤は
マス, 緑は
マス, 青は
マス塗る. 塗らないマスがあってもよい. 同じ色は隣り合ったマスに塗ることはできないが, 異なる色であれば連続して2つのマスまで塗っても良い. また, 連続して
つ以上のマスに色を塗ることはできない。
解法
マス連続して塗るマスの数を固定すると,
マス塗る数が決まるのでその並べ方の数を先に求める. 赤を
マス塗る部分にどれだけ塗るかを固定すると, どこに何を塗るかがすべて決まるようになる.
yukicoder No.794 チーム戦 (2)
問題概要
個の数
が与えられる. 2つの数の和が
以下になるように完全マッチングする. このような完全マッチングはいくつできるか.
は偶数
解法
yukicoder No.1044 正直者大学
問題概要
人数がである2つのグループ
がある. これらの人を円状に並べるとき, 隣り合う同じグループの人のペアが
個以上となる並べ方の数を求めよ.
解法
連続した同じグループの人を組と考える. グループ
の人を
組に分割すると固定すると, 「区別できない
人(
人)を区別できる
組に分ける(各組には
人以上入る)」ことにし, あとから
人(
人)の並べ方を決めるようにすると二項係数を用いて簡単に表すことができる. ただし, 円順列であるので
で割ることが必要.
組に分割するとき, 隣り合う同じグループのペアは
となるので,
の動く範囲は
以上
以下となる.
ABC180 F - Unbranched
問題概要
自己ループを持たずすべての頂点の次数が以下であり, 連結成分のサイズの最大値が
であるようなラベル付き
頂点, ラベル無し
辺のグラフの数を求めよ.
解法
ラベル付き頂点を複数の集合に分ける方法を考えるとき, ラベル番号が小さい頂点から連結成分を決めていくことで重複なく数え上げることができる.
頂点
辺を決めたときのグラフの数として.
ABC167 E - Colorful Blocks
問題概要
個のマスの各マスを
色のいずれかで塗る方法で, 隣り合うマスが同じ色で塗られている組が
組以下である者の数を求めよ.
解法
同じ色が隣り合うマスを決めると, そのマスを一つのマスとして考えると同じ色が隣り合わないような塗り方を求める問題と同等になる.
ABC163 F - path pass i
問題概要
頂点の木に色が塗られている(色は
以上
以下の整数で表され, 重複もある).
に対して, 色
が塗られている頂点を一度以上通る単純パスの数を求めよ.
解法
ABC158 E - Divisible Substring
解法
から
まででできる数字を
とする.
から
まででできる数字が
の倍数になるのは,
となるのでを計算しておけばよい.
ABC160 F - Distributing Integers
問題概要
頂点の木の各頂点
に対して
に
を書き,
を順番に「まだ整数が書かれていない頂点であって,整数が書かれた頂点に隣接している頂点」に書くときの整数の書き方として考えられるものの数を求めよ.
解法
を根とする根付き木を考えると, ある根付き部分木の答えは根の各子
を根とする根付き部分木
の答えを
として,
が答えとなる.
これをに対して求めるには全方位木DPを用いればよい.
ABC147 F - Sum Difference
問題概要
長さの初項
公差
の等差数列
がある.
からいくつかの要素をいくつか選び, その和を
, 選ばなかった要素の和を
とするとき,
として考えられる値は何通りあるか.
解法
数列の総和をとするとき
となるので,
として考えられる値の数を数えればよい.
数列から選ぶ個数をとすると,
となる.
「以上
以下の整数のうち
個の和」で表される整数は
以上
以下の整数すべてである.
の取り得る値は
おきなることからすべての
について
を
で割った余り毎に考えると, 少なくとも一つの区間に含まれるような値の個数を数えればよいことになる.
ABC146 E - Rem of Sum is Num
問題概要
長さの正整数列
の空でない連続部分列の要素の和を
で割った余りが要素の数と等しくなるものの数を求めよ.
解法
を
番目までの要素の和とすると,
番目から
番目までの部分列が条件を満たすのは
かつ
変形すると
かつ
となるので, を計算し,
を満たす
の数を数えればよい.
ABC138 F - Coincidence
問題概要
かつ
を
で割った余りが
と等しい
の個数を求めよ.
解法
条件を満たすとき, を
で割った余りは
と表せる. 結局これは
の計算において繰り下がりが発生しないことと同値となる.
と
と
の最上位ビットの位置が等しいという情報をもって桁DPすればよい.
ABC135 D - Digits Parade
問題概要
各文字が~
である文字列
の各
を
~
のいずれかに置き換えてできる整数のうち,
で割って
余る数は何通りか. 先頭に余分な
があってもよいものとする.
解法
で割った余りを情報としてもってDP
ABC134 F - Permutation Oddness
問題概要
となるような
の順列
の個数を求めよ.
解法
前から何番目まで見たか, そのうち何個決めたか, そのとき確定している和の値をもってDP
ABC133 E - Virus Tree 2
問題概要
ラベル付き頂点の木の頂点それぞれに対して
色のうちいずれか
色で塗るとき, 二つの異なる頂点の距離が
以下ならば, その二つの頂点の色が異なるように塗る方法の数を求めよ.
解法
適当な頂点を根とする. ある根以外の頂点の子を塗る方法は子の数をとして,
通りとなる(その頂点とその親の色以外の色で塗る方法の数). これを根から順番に求めていけばよい.
ABC132 F - Small Products
問題概要
長さの正整数列のうちどの隣り合う要素の積も
以下となるものの数を求めよ.
解法
番目まで決めて最後の整数が
であるようなものの数とすると
となるが,
の値が同じであるような
をまとめることができるので
で解くことができる.
ABC129 E - Sum Equals Xor
問題概要
正整数が二進数表記で与えられる. 以下の条件を満たす非負整数
の組の数を求めよ.
解法
2つの条件は
と言い換えられるので上位の桁から以下が確定してるかという情報をもってDP
ABC110 D - Factorization
問題概要
となる正整数からなる長さ
の数列
として考えられるものの数を求めよ.
解法
の素因数ごとに
のどの要素にいくつその素因数がかけられるかを考えると解ける.
ABC104 D - We Love ABC
問題概要
からなる文字列
の
を
のいずれかに変更することによって得られる文字列全てにおいて, 部分列として含まれる
の数の和を求めよ.
解法
の位置を固定すると, それより左にある
の数×それより右にある
の数が求めるものとなる.
を変更することによってできる文字列の数も考慮すると解くことができる.
ABC098 D - Xor Sum 2
問題概要
長さの数列
の連続部分列のうちその連続部分列に含まれるすべての要素のXORとすべての要素の和が等しいような連続部分列の数を求めよ.
解法
XORと和が等しくなるのはbitごとにそのbitが1である要素が高々1つしかないとき. bitごとにそのbitが1であるかどうかの情報をもって尺取り法などをしてやればよい.
ABC077 D - 11
問題概要
以上
以下の各整数を1つ以上含む長さ
の数列
が与えられる(
の要素のうち1つだけ重複がある).
について長さ
の部分列の数を求めよ. ただし, 数列として同じものは
通りと数える.
解法
数列に2つ含まれる数の位置のみが重要であり, その位置をとする. 部分列の数は
であり, そのうち
と
のどちらか一方のみを含み,
を含まないものを重複して数えているので, その分の
を引いたものが答え.
ABC050 D - Xor Sum
問題概要
ある非負整数が存在して
となるような
の組が何通りあるか求めよ.
解法
任意のbit目において
の
ビット目と
の
ビット目の組として
であるという制約をつけると
の数え上げを
の数え上げに変更できる. 「何bit目まで決めたか」と「そこまでで
の値(
以上なら
)」という情報をもって桁DP
ARC110 D - Binomial Coefficient is Fun
問題概要
長さの非負整数列
が与えられる. 長さ
で和が
以下である任意の非負整数列
について,
の値の総和を求めよ.
解法
として
が答え.
負の二項定理を考えるととなるので
として
ABC173 F - Intervals on Tree
問題概要
与えられる頂点のラベル付き木に対して
を「
以上
以下の頂点とそれを両端に持つ辺からなる部分グラフの連結成分の個数」と定義したとき,
を求めよ.
解法
できるグラフは森になる. 森の連結成分数を, 辺数を
, 頂点数を
とするとき
が成り立つので, 各
に対する頂点数を
, 辺数を
とすると
を求めることとなる.
であり,
は
を直接求めるのではなくてすべての辺についてその辺が含まれるような
の数を求めればよいので解くことができる.
ABC169 F - Knapsack for All Subsets
問題概要
長さの正整数列
と
が与えられる.
の空でない部分集合
について
を次のように定義する.
の空でない部分集合
であって,
を満たすものの個数.
として考えられる集合すべてに対して
の和を求めよ.
解法
となるような集合
を部分集合として持つ
の数は
個ある(
に含まれないものそれぞれに対して含むか含まないかの2択).
ABC159 F - Knapsack for All Segments
問題概要
長さの正整数列
と
が与えられる.
を次のように定義する.
かつ
を満たすような整数列
の個数.
を満たす
の組全てに対する
の和を求めよ.
ABC158 F - Removing Robots
問題概要
数直線上に, 個の大きさの無視できるロボットがある. ロボット
は座標
に存在し, 起動すると
だけ正の方向に毎秒1で移動し, 移動を終えると同時に数直線上から取り除かれる. ロボットを一つ起動する操作を0回以上行うとき数直線上に残っているロボットの組み合わせとして考えられるものは何通りあるか. ロボット
が移動する過程で, 数直線上の座標
以上
未満の範囲に残っている別のロボット
と接触したら, ロボット
も起動される.
解法
頂点の空グラフを用意する.
の大きい方から順にそのロボット
を起動したときロボット
が起動される場合頂点
から
に有向辺を張る. ただしすでに入次数が
以上の頂点には辺は張らないものとする. このようにしてできたグラフは森となる. 各木ごとに葉(入次数
の頂点)から求めていけばいい.
ABC154 F - Many Many Paths
問題概要
かつ
に対して2次元平面上で
から
軸正の方向に1もしくは
軸正の方向に
移動することを繰り返して
まで移動する経路の数の和を求めよ.
解法
に対する答えは
ABC150 E - Change a Little Bit
問題概要
からなる長さ
の異なる2つの数列
に対し, 関数
を以下のように定義する.
に対し以下の操作を繰り返して
と等しくすることを考える. このとき行う操作のコストの和として考えられる最小値が
である.
を(
から
, もしくは
から
に)変更する. この操作のコストは, 変更直前に
であったような整数
の個数を
として,
である.
すべてのの組について
の和を求めよ.
解法
の降順に変更するのが最適.
を降順に並べ替える.
番目を変更するときに
となる
の組の数は
であるので答えは
ABC140 E - Second Sum
問題概要
の順列
が与えられる. すべての
について
の中で
番目に大きい数の総和を求めよ.
解法
が
番目に大きい数となるような
の数はstd::setで
の降順に位置を管理することで求めることができる.
ABC136 F - Enclosed Points
問題概要
次元平面上の
個の点(どの
点の
座標も
座標も異なる)が与えられる. 全点集合の空でないすべて部分集合
に対して, 各辺が座標軸と平行であって
の点をすべて含むような最小の長方形に含まれる点の個数の総和を求めよ.
解法
ある点が含まれる長方形を作るような部分集合の数を求める. その点より右上, 左上, 左下, 右下にある点の数をBITなどを用いて求めることで解くことができる.
ABC127 E - Cell Distance
問題概要
行
列のマス目のうち
マスに駒を
つずつ置く. 全ての配置について全ての駒のペアのマンハッタン距離の和の総和を求めよ.
解法
あるマスに駒が置かれているような置き方の数は
個あるので, すべての
マスのペアにおけるマンハッタン距離の和を求めればよいが,
座標と
座標について独立に求めることができ,
座標の差が
となるような置き方の数は
あるので解くことができる.
ARC102 E - Stop. Otherwise...
問題概要
区別できない面サイコロを
個振る. 各
に対し, どの異なる
つのサイコロの出目の和も
にならないような出目の組の場合の数を求めよ.
解法
となる
の数は
となる.
となる
一つに対して
のどちらの目も一つ以上出るような出目の数は
であり, このようにして包除原理を用いて解くことができる.
ARC101 E - Ribbons on Tree
問題概要
頂点(
は偶数)の木の頂点を
組のペアに分け, どのペア間の最短パスにも含まれない辺がないようなペアの分け方は何通りあるか.
解法
包除原理を用いると, となる. 「今の部分木」,「今の連結成分の頂点数」,「これまでに取り除いた辺の本数の偶奇」をもって木DPをする.