hitoare日記

たまに書きます

F - Unbranched(AtCoder Beginner Contest 180)

問題リンク


問題概要

 頂点にラベルが振られている\(N\)頂点\(M\)辺の無向グラフであって、以下の条件を満たすものはいくつあるか求めよ。

  • 自己ループを持たない
  • 全ての頂点の次数が2以下
  • 連結成分のサイズの最大値が\(L\)
解法

 2番目の条件より、各連結成分については一本道のようなグラフ(o-o-o-...-o-o)か、単純サイクル、もしくは孤立点しかありえない。よって、連結成分のサイズを決めればその中での辺の数と組み合わせは簡単に求まる。

この問題では\(N\)個の頂点をいくつかの連結成分に分割する必要がある。

ここで、この問題を解く着想を得るために、一旦より簡単な次の問題を考える。

{1,2,...,N}をいくつかのグループに分割する方法は何通りあるか。

これは以下のようなDPで解ける。

\(dp[i] = \{1,..,i\}\)の分け方の総数

とおく。\(dp[1]=1\)である。また、このあとの都合上\(dp[0]=1\)とする。

\(dp[i-1]\)までが求まっているとして\( \{1,...,i\}\)の分け方の総数を求める。

\(i\)が属するグループのサイズを\(j (1 \leq j \leq i) \)とすると、

このようなグループのとり方は\( {}_{i-1}C_{j-1} \)通りある。(\(i\)以外の要素を\( \{ 1,...,i-1\}\)から\(j-1\)個とるため)

また、残りの\(i-j\)個の点の分け方は\(dp[i-j]\)通りである。

よって、\(dp[i] = \sum_{j=1}^{i} {}_{i-1}C_{j-1} \times dp[i-j] \)

となる。

 

元の問題に戻る。

\(dp[i][j][k] \)を

頂点を\(i\)個使って

辺を\(j\)本使って

連結成分の最大値が\(L\)かどうか\( (k=0or1) \)

を満たすようなグラフの総数

として、\(i=1\)から\(N\)まで更新していけば良い。

計算量は\( O(NML) \)になる。

提出

https://atcoder.jp/contests/abc180/submissions/17463080

感想

 初1桁が嬉しくて久々に書いた。

project euler550問解くまでにやったこと+おすすめ問題

本来は500問の時に書こうと思っていた。

限界が見えてきて精神的に一区切りついたタイミングで書いています。

Project Eulerとは

About - Project Euler

数学の問題が解けるサイトです。

やったこと
  • 計算
おすすめ問題

★→特におすすめ

競プロよりの問題

Investigating in how many ways objects of two different colours can be grouped

Tours on a 4 x n playing board

★Tidying up

A frog's trip

Music fesrival

Constrained Sums

Centaurs on a chess board

Sums of subarrays

数学よりの問題

RSA encryption

Investigating the primality of numbers of the form 2n^2-1

Cardano Triplets

Pseudo Square Root

Constraining the least greatest and the greatest least

Least common multiple count

★Unfair wager

Exploding sequence

Nearly isosceles 120 degree triangles

Quintinomial coefficients

Square prime factors II

E - Coprime(AtCoder Beginner Contest 177)

問題リンク

atcoder.jp


問題概要

 N個の自然数からなる集合\( \{A_i \}\)が与えられる。

この集合が「pairwise coprime」「setwise coprime」「そのどちらでもない」のどれかを判定せよ。

ただし、「pairwise coprime」とは、どの相異なる2要素もそのGCDが1であることであり、「setwise coprime」とは、pairwise coprimeでなく、全ての要素のGCDが1であることを指す。

解法

まず、\(1 \leq A_i \leq 10^6\)なので、\(10^6\)以下の整数を高速に素因数分解できるようにエラトステネスの篩の要領で素因数のテーブルを作っておく。 

自然数A,Bに対し、AとBのGCDが1であるとは、AとBが同じ素因数を持たないことと同値である。

よって、pairwise coprimeかどうかを判定するには、\(A_1\)から順番に素因数を保存しながら「\(A_k\)の素因数のうち\( A_1,...,A_{k - 1} \)までに出てきたものが存在するか」をチェックすればよい。

また、setwise coprimeであることと「\(A_1,...,A_N\)全てに共通する素因数が存在しない」ことは同値である。

よって、素数pに対し\(f(p)\)を\(A_1,...,A_N\)の素因数に出てきた回数として、\(f(p)=N\)であるものが1つでも存在するかどうかをチェックすれば良く、存在しなければsetwise coprimeである。

(追記:本番は上の方針を取ったが、実際は全体のGCDを取るだけでいい。)

提出

https://atcoder.jp/contests/abc177/submissions/16325578

感想

かなり数学よりだと思ったけど意外とAC数が多い。