SlideShare uma empresa Scribd logo
1 de 9
Baixar para ler offline
029_mod7占い【上級・ 
アルゴリズム】解説 
ギノ株式会社 吉岡 恒夫
問題 
• 問題: https://paiza.jp/learning/mod7 
• あなたは今、「mod7占い」というサービスを始めようと考えています。 
• mod7占いとは、整数が書かれた複数のカードの中から3枚を選び、そこ 
に書かれた整数の和が7で割り切れるかどうかで運勢を決めようというも 
のです。 カードは必ず異なる3枚を選ぶ必要があり、全てのカードには全 
て異なる数字が書かれています。 
• 占いというからには、7で割り切れる組み合わせはそれなりに少なくする 
必要があります。 そこで、適当な複数のカードに対して、カードに書か 
れた3つの整数を足した和が7で割り切れるような組合せがいくつあるか 
を計算するプログラムを作成してください。
問題まとめ 
• N個の数列a_iから3つを選ぶ 
• 3つの数字の合計が7で割り切れる組み合わせの 
数を出力する。 
• 1≤N≤100,000 
0≤a_i < 2^32
解法1 
(総当たり) 
• 1つ目の数字を選ぶループ 
• 2つ目の数字を選ぶループ 
• 3つ目の数字を選ぶループ 
• 合計が7で割り切れるか確認
解法1(計算量) 
• 三重ループ 
• 組み合わせの数: C(N, 3) = N*(N-1)*(N-2)/6 = 
166,661,666,700,000 (n=100,000) 
• 計算量: O(N^3) 
• 無理~
解法2 
• 足す前に剰余を取っても、結果は変わらない。 
(A+B)%7 = (A%7 + B%7 + C%7)%7 
• 0~6の値のみ与えられたと考えてよい。 
• 3つを選ぶ組み合わせは 7 * 7 * 7 = 343
解法2 
• 各a_iについて、7で割った余り0-6の出現回数を数える。 
• 0-6の数字から1つめの数字を選ぶループ 
• 0-6の数字から2つめの数字を選ぶループ 
• 0-6の数字から3つめの数字を選ぶループ 
• 組み合わせの数を計算 
1つめの数、2つめの数、3つめの数、 
の出現回数を掛け合わせる 
2つの数字が同じ場合、重複を除くため重複の片方を1引いて、2で割 
る 
3つの数字が同じ場合、重複を除くため重複の片方を1もう片方を2引 
いて、6で割る
コード
N= 
gets.to_i 
counts 
= 
Array.new(7,0) 
STDIN.read.split.map(&:to_i).map{|i| 
i%7}.each{|a| 
counts[a] 
+= 
1 
} 
total 
= 
0 
(0..6).each{|i| 
(i..6).each{|j| 
(j..6).each{|k| 
next 
if 
(i+j+k)%7 
!= 
0 
c1 
= 
counts[i] 
c2 
= 
counts[j] 
c3 
= 
counts[k] 
c2 
-­‐= 
1 
if 
i 
== 
j 
c3 
-­‐= 
1 
if 
k 
== 
i 
c3 
-­‐= 
1 
if 
k 
== 
j 
pat 
= 
c1*c2*c3 
if 
i==j 
&& 
j==k 
pat 
/= 
6 
elsif 
i==j 
|| 
i==k 
|| 
j==k 
pat 
/= 
2 
end 
total 
+= 
pat 
} 
} 
} 
puts 
total

Mais conteúdo relacionado

Mais procurados

実践・最強最速のアルゴリズム勉強会 第一回 講義資料(ワークスアプリケーションズ & AtCoder)
実践・最強最速のアルゴリズム勉強会 第一回 講義資料(ワークスアプリケーションズ & AtCoder)実践・最強最速のアルゴリズム勉強会 第一回 講義資料(ワークスアプリケーションズ & AtCoder)
実践・最強最速のアルゴリズム勉強会 第一回 講義資料(ワークスアプリケーションズ & AtCoder)AtCoder Inc.
 
AtCoder Beginner Contest 033 解説
AtCoder Beginner Contest 033 解説AtCoder Beginner Contest 033 解説
AtCoder Beginner Contest 033 解説AtCoder Inc.
 
AtCoder Regular Contest 029 解説
AtCoder Regular Contest 029 解説AtCoder Regular Contest 029 解説
AtCoder Regular Contest 029 解説AtCoder Inc.
 
AtCoder Beginner Contest 002 解説
AtCoder Beginner Contest 002 解説AtCoder Beginner Contest 002 解説
AtCoder Beginner Contest 002 解説AtCoder Inc.
 
情報システム障害解析のための知識グラフ構築の試み / Constructing a knowledge graph for information sys...
情報システム障害解析のための知識グラフ構築の試み / Constructing a knowledge graph for information sys...情報システム障害解析のための知識グラフ構築の試み / Constructing a knowledge graph for information sys...
情報システム障害解析のための知識グラフ構築の試み / Constructing a knowledge graph for information sys...Shinji Takao
 
AtCoder Beginner Contest 034 解説
AtCoder Beginner Contest 034 解説AtCoder Beginner Contest 034 解説
AtCoder Beginner Contest 034 解説AtCoder Inc.
 
トピックモデルの評価指標 Perplexity とは何なのか?
トピックモデルの評価指標 Perplexity とは何なのか?トピックモデルの評価指標 Perplexity とは何なのか?
トピックモデルの評価指標 Perplexity とは何なのか?hoxo_m
 
CNNとGAを用いた 組合せ最適化問題
CNNとGAを用いた 組合せ最適化問題CNNとGAを用いた 組合せ最適化問題
CNNとGAを用いた 組合せ最適化問題t dev
 
実践・最強最速のアルゴリズム勉強会 第二回講義資料(ワークスアプリケーションズ & AtCoder)
実践・最強最速のアルゴリズム勉強会 第二回講義資料(ワークスアプリケーションズ & AtCoder)実践・最強最速のアルゴリズム勉強会 第二回講義資料(ワークスアプリケーションズ & AtCoder)
実践・最強最速のアルゴリズム勉強会 第二回講義資料(ワークスアプリケーションズ & AtCoder)AtCoder Inc.
 
幾何コンテスト2013
幾何コンテスト2013幾何コンテスト2013
幾何コンテスト2013Naoto Mizuno
 
Triplet Loss 徹底解説
Triplet Loss 徹底解説Triplet Loss 徹底解説
Triplet Loss 徹底解説tancoro
 
fastTextの実装を見てみた
fastTextの実装を見てみたfastTextの実装を見てみた
fastTextの実装を見てみたYoshihiko Shiraki
 
Kaggle&競プロ紹介 in 中田研究室
Kaggle&競プロ紹介 in 中田研究室Kaggle&競プロ紹介 in 中田研究室
Kaggle&競プロ紹介 in 中田研究室Takami Sato
 
AtCoder Beginner Contest 006 解説
AtCoder Beginner Contest 006 解説AtCoder Beginner Contest 006 解説
AtCoder Beginner Contest 006 解説AtCoder Inc.
 
AtCoder Beginner Contest 020 解説
AtCoder Beginner Contest 020 解説AtCoder Beginner Contest 020 解説
AtCoder Beginner Contest 020 解説AtCoder Inc.
 
AtCoder Beginner Contest 023 解説
AtCoder Beginner Contest 023 解説AtCoder Beginner Contest 023 解説
AtCoder Beginner Contest 023 解説AtCoder Inc.
 
Latent ODEs for Irregularly-Sampled Time Series
Latent ODEs for Irregularly-Sampled Time SeriesLatent ODEs for Irregularly-Sampled Time Series
Latent ODEs for Irregularly-Sampled Time Seriesaza rashi
 
べき乗則・パレート分布・ジップの法則
べき乗則・パレート分布・ジップの法則べき乗則・パレート分布・ジップの法則
べき乗則・パレート分布・ジップの法則Hiroyuki Kuromiya
 

Mais procurados (20)

実践・最強最速のアルゴリズム勉強会 第一回 講義資料(ワークスアプリケーションズ & AtCoder)
実践・最強最速のアルゴリズム勉強会 第一回 講義資料(ワークスアプリケーションズ & AtCoder)実践・最強最速のアルゴリズム勉強会 第一回 講義資料(ワークスアプリケーションズ & AtCoder)
実践・最強最速のアルゴリズム勉強会 第一回 講義資料(ワークスアプリケーションズ & AtCoder)
 
AtCoder Beginner Contest 033 解説
AtCoder Beginner Contest 033 解説AtCoder Beginner Contest 033 解説
AtCoder Beginner Contest 033 解説
 
AtCoder Regular Contest 029 解説
AtCoder Regular Contest 029 解説AtCoder Regular Contest 029 解説
AtCoder Regular Contest 029 解説
 
AtCoder Beginner Contest 002 解説
AtCoder Beginner Contest 002 解説AtCoder Beginner Contest 002 解説
AtCoder Beginner Contest 002 解説
 
情報システム障害解析のための知識グラフ構築の試み / Constructing a knowledge graph for information sys...
情報システム障害解析のための知識グラフ構築の試み / Constructing a knowledge graph for information sys...情報システム障害解析のための知識グラフ構築の試み / Constructing a knowledge graph for information sys...
情報システム障害解析のための知識グラフ構築の試み / Constructing a knowledge graph for information sys...
 
AtCoder Beginner Contest 034 解説
AtCoder Beginner Contest 034 解説AtCoder Beginner Contest 034 解説
AtCoder Beginner Contest 034 解説
 
トピックモデルの評価指標 Perplexity とは何なのか?
トピックモデルの評価指標 Perplexity とは何なのか?トピックモデルの評価指標 Perplexity とは何なのか?
トピックモデルの評価指標 Perplexity とは何なのか?
 
CNNとGAを用いた 組合せ最適化問題
CNNとGAを用いた 組合せ最適化問題CNNとGAを用いた 組合せ最適化問題
CNNとGAを用いた 組合せ最適化問題
 
実践・最強最速のアルゴリズム勉強会 第二回講義資料(ワークスアプリケーションズ & AtCoder)
実践・最強最速のアルゴリズム勉強会 第二回講義資料(ワークスアプリケーションズ & AtCoder)実践・最強最速のアルゴリズム勉強会 第二回講義資料(ワークスアプリケーションズ & AtCoder)
実践・最強最速のアルゴリズム勉強会 第二回講義資料(ワークスアプリケーションズ & AtCoder)
 
幾何コンテスト2013
幾何コンテスト2013幾何コンテスト2013
幾何コンテスト2013
 
Triplet Loss 徹底解説
Triplet Loss 徹底解説Triplet Loss 徹底解説
Triplet Loss 徹底解説
 
全域木いろいろ
全域木いろいろ全域木いろいろ
全域木いろいろ
 
fastTextの実装を見てみた
fastTextの実装を見てみたfastTextの実装を見てみた
fastTextの実装を見てみた
 
Kaggle&競プロ紹介 in 中田研究室
Kaggle&競プロ紹介 in 中田研究室Kaggle&競プロ紹介 in 中田研究室
Kaggle&競プロ紹介 in 中田研究室
 
AtCoder Beginner Contest 006 解説
AtCoder Beginner Contest 006 解説AtCoder Beginner Contest 006 解説
AtCoder Beginner Contest 006 解説
 
Abc009
Abc009Abc009
Abc009
 
AtCoder Beginner Contest 020 解説
AtCoder Beginner Contest 020 解説AtCoder Beginner Contest 020 解説
AtCoder Beginner Contest 020 解説
 
AtCoder Beginner Contest 023 解説
AtCoder Beginner Contest 023 解説AtCoder Beginner Contest 023 解説
AtCoder Beginner Contest 023 解説
 
Latent ODEs for Irregularly-Sampled Time Series
Latent ODEs for Irregularly-Sampled Time SeriesLatent ODEs for Irregularly-Sampled Time Series
Latent ODEs for Irregularly-Sampled Time Series
 
べき乗則・パレート分布・ジップの法則
べき乗則・パレート分布・ジップの法則べき乗則・パレート分布・ジップの法則
べき乗則・パレート分布・ジップの法則
 

Mais de paiza

paizaのオンラインジャッジを支えるDockerとその周辺
paizaのオンラインジャッジを支えるDockerとその周辺paizaのオンラインジャッジを支えるDockerとその周辺
paizaのオンラインジャッジを支えるDockerとその周辺paiza
 
141214_paizaでpizzaもぐもぐ勉強会
141214_paizaでpizzaもぐもぐ勉強会141214_paizaでpizzaもぐもぐ勉強会
141214_paizaでpizzaもぐもぐ勉強会paiza
 
シリコンバレー 面接体験
シリコンバレー 面接体験シリコンバレー 面接体験
シリコンバレー 面接体験paiza
 
ハノイの塔 解説
ハノイの塔 解説ハノイの塔 解説
ハノイの塔 解説paiza
 
paizaオンラインハッカソン(略してPOH![ポー!])Lite「天才火消しエンジニア霧島 もしPMおじさんが『丸投げ』を覚えたら」解説
paizaオンラインハッカソン(略してPOH![ポー!])Lite「天才火消しエンジニア霧島 もしPMおじさんが『丸投げ』を覚えたら」解説paizaオンラインハッカソン(略してPOH![ポー!])Lite「天才火消しエンジニア霧島 もしPMおじさんが『丸投げ』を覚えたら」解説
paizaオンラインハッカソン(略してPOH![ポー!])Lite「天才火消しエンジニア霧島 もしPMおじさんが『丸投げ』を覚えたら」解説paiza
 
【社内勉強会資料】自社サービスエンジニアの為の「UX設計と情報設計」
【社内勉強会資料】自社サービスエンジニアの為の「UX設計と情報設計」【社内勉強会資料】自社サービスエンジニアの為の「UX設計と情報設計」
【社内勉強会資料】自社サービスエンジニアの為の「UX設計と情報設計」paiza
 

Mais de paiza (6)

paizaのオンラインジャッジを支えるDockerとその周辺
paizaのオンラインジャッジを支えるDockerとその周辺paizaのオンラインジャッジを支えるDockerとその周辺
paizaのオンラインジャッジを支えるDockerとその周辺
 
141214_paizaでpizzaもぐもぐ勉強会
141214_paizaでpizzaもぐもぐ勉強会141214_paizaでpizzaもぐもぐ勉強会
141214_paizaでpizzaもぐもぐ勉強会
 
シリコンバレー 面接体験
シリコンバレー 面接体験シリコンバレー 面接体験
シリコンバレー 面接体験
 
ハノイの塔 解説
ハノイの塔 解説ハノイの塔 解説
ハノイの塔 解説
 
paizaオンラインハッカソン(略してPOH![ポー!])Lite「天才火消しエンジニア霧島 もしPMおじさんが『丸投げ』を覚えたら」解説
paizaオンラインハッカソン(略してPOH![ポー!])Lite「天才火消しエンジニア霧島 もしPMおじさんが『丸投げ』を覚えたら」解説paizaオンラインハッカソン(略してPOH![ポー!])Lite「天才火消しエンジニア霧島 もしPMおじさんが『丸投げ』を覚えたら」解説
paizaオンラインハッカソン(略してPOH![ポー!])Lite「天才火消しエンジニア霧島 もしPMおじさんが『丸投げ』を覚えたら」解説
 
【社内勉強会資料】自社サービスエンジニアの為の「UX設計と情報設計」
【社内勉強会資料】自社サービスエンジニアの為の「UX設計と情報設計」【社内勉強会資料】自社サービスエンジニアの為の「UX設計と情報設計」
【社内勉強会資料】自社サービスエンジニアの為の「UX設計と情報設計」
 

mod7占い【上級・アルゴリズム】解説

  • 2. 問題 • 問題: https://paiza.jp/learning/mod7 • あなたは今、「mod7占い」というサービスを始めようと考えています。 • mod7占いとは、整数が書かれた複数のカードの中から3枚を選び、そこ に書かれた整数の和が7で割り切れるかどうかで運勢を決めようというも のです。 カードは必ず異なる3枚を選ぶ必要があり、全てのカードには全 て異なる数字が書かれています。 • 占いというからには、7で割り切れる組み合わせはそれなりに少なくする 必要があります。 そこで、適当な複数のカードに対して、カードに書か れた3つの整数を足した和が7で割り切れるような組合せがいくつあるか を計算するプログラムを作成してください。
  • 3. 問題まとめ • N個の数列a_iから3つを選ぶ • 3つの数字の合計が7で割り切れる組み合わせの 数を出力する。 • 1≤N≤100,000 0≤a_i < 2^32
  • 4. 解法1 (総当たり) • 1つ目の数字を選ぶループ • 2つ目の数字を選ぶループ • 3つ目の数字を選ぶループ • 合計が7で割り切れるか確認
  • 5. 解法1(計算量) • 三重ループ • 組み合わせの数: C(N, 3) = N*(N-1)*(N-2)/6 = 166,661,666,700,000 (n=100,000) • 計算量: O(N^3) • 無理~
  • 6. 解法2 • 足す前に剰余を取っても、結果は変わらない。 (A+B)%7 = (A%7 + B%7 + C%7)%7 • 0~6の値のみ与えられたと考えてよい。 • 3つを選ぶ組み合わせは 7 * 7 * 7 = 343
  • 7. 解法2 • 各a_iについて、7で割った余り0-6の出現回数を数える。 • 0-6の数字から1つめの数字を選ぶループ • 0-6の数字から2つめの数字を選ぶループ • 0-6の数字から3つめの数字を選ぶループ • 組み合わせの数を計算 1つめの数、2つめの数、3つめの数、 の出現回数を掛け合わせる 2つの数字が同じ場合、重複を除くため重複の片方を1引いて、2で割 る 3つの数字が同じ場合、重複を除くため重複の片方を1もう片方を2引 いて、6で割る
  • 9. N= gets.to_i counts = Array.new(7,0) STDIN.read.split.map(&:to_i).map{|i| i%7}.each{|a| counts[a] += 1 } total = 0 (0..6).each{|i| (i..6).each{|j| (j..6).each{|k| next if (i+j+k)%7 != 0 c1 = counts[i] c2 = counts[j] c3 = counts[k] c2 -­‐= 1 if i == j c3 -­‐= 1 if k == i c3 -­‐= 1 if k == j pat = c1*c2*c3 if i==j && j==k pat /= 6 elsif i==j || i==k || j==k pat /= 2 end total += pat } } } puts total