数え上げ問題と簡単な解法をまとめる.
「で割った余りを求めよ」などはいちいち書かないので答えが大きくなるなら余りを求めると考えてもらっていい.
目次
- 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
問題概要
0から9までの数字からなる文字列の空でない連続部分文字列のうち十進表記の整数とみなしたときに素数で割り切れるものの個数を求めよ. 先頭に余分な0があってもよいもののとする.
解法
からまででできる数字をとする. からまででできる数字がの倍数になるのは,
となるのでを計算しておけばよい.
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択).
ABC162 E - Sum of gcd of Tuples (Hard)
問題概要
以上以下の整数からなる長さの数列すべてについての和を求めよ.
解法
となるので約数版の高速ゼータ変換・高速メビウス変換をすれば解ける.
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をする.