頂点i(1≤i≤N)から到達可能な頂点の集合Siについて,Siに含まれる頂点に書いてある数の最大公約数をGiとします.
与えられた有向グラフを強連結成分分解したとき,同じ強連結成分に含まれる任意の2頂点u,vについて,明らかにGu=Gvが成り立ちます.従って,まず強連結成分ごとにGCDを求め,次に,強連結成分を頂点とみなした有向非巡回グラフについてDFSの帰りがけ順に子頂点の値のGCDを求めていくことで,全ての頂点におけるGiを,O((N+M)log(A))で求めることができます.
コード例(C++)