SlideShare a Scribd company logo
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

More Related Content

What's hot

AtCoder Beginner Contest 002 解説
AtCoder Beginner Contest 002 解説AtCoder Beginner Contest 002 解説
AtCoder Beginner Contest 002 解説
AtCoder Inc.
 
AtCoder Regular Contest 022 解説
AtCoder Regular Contest 022 解説AtCoder Regular Contest 022 解説
AtCoder Regular Contest 022 解説
AtCoder Inc.
 
AtCoder Regular Contest 034 解説
AtCoder Regular Contest 034 解説AtCoder Regular Contest 034 解説
AtCoder Regular Contest 034 解説
AtCoder Inc.
 
AtCoder Regular Contest 037 解説
AtCoder Regular Contest 037 解説AtCoder Regular Contest 037 解説
AtCoder Regular Contest 037 解説
AtCoder Inc.
 
Code Formula 2014 予選A 解説
Code Formula 2014 予選A 解説Code Formula 2014 予選A 解説
Code Formula 2014 予選A 解説
AtCoder Inc.
 
AtCoder Regular Contest 025 解説
AtCoder Regular Contest 025 解説AtCoder Regular Contest 025 解説
AtCoder Regular Contest 025 解説
AtCoder Inc.
 
幾何コンテスト2013
幾何コンテスト2013幾何コンテスト2013
幾何コンテスト2013Naoto Mizuno
 
CODE FESTIVAL 2014 本選 解説
CODE FESTIVAL 2014 本選 解説CODE FESTIVAL 2014 本選 解説
CODE FESTIVAL 2014 本選 解説
AtCoder Inc.
 
AtCoder Beginner Contest 034 解説
AtCoder Beginner Contest 034 解説AtCoder Beginner Contest 034 解説
AtCoder Beginner Contest 034 解説
AtCoder Inc.
 
Re永続データ構造が分からない人のためのスライド
Re永続データ構造が分からない人のためのスライドRe永続データ構造が分からない人のためのスライド
Re永続データ構造が分からない人のためのスライド
Masaki Hara
 
AtCoder Beginner Contest 023 解説
AtCoder Beginner Contest 023 解説AtCoder Beginner Contest 023 解説
AtCoder Beginner Contest 023 解説
AtCoder Inc.
 
すごい constexpr たのしくレイトレ!
すごい constexpr たのしくレイトレ!すごい constexpr たのしくレイトレ!
すごい constexpr たのしくレイトレ!Genya Murakami
 
Indeedなう 予選A 解説
Indeedなう 予選A 解説Indeedなう 予選A 解説
Indeedなう 予選A 解説
AtCoder Inc.
 
AtCoder Beginner Contest 029 解説
AtCoder Beginner Contest 029 解説AtCoder Beginner Contest 029 解説
AtCoder Beginner Contest 029 解説
AtCoder Inc.
 
AtCoder Beginner Contest 014 解説
AtCoder Beginner Contest 014 解説AtCoder Beginner Contest 014 解説
AtCoder Beginner Contest 014 解説
AtCoder Inc.
 
プログラミングコンテストでのデータ構造 2 ~動的木編~
プログラミングコンテストでのデータ構造 2 ~動的木編~プログラミングコンテストでのデータ構造 2 ~動的木編~
プログラミングコンテストでのデータ構造 2 ~動的木編~
Takuya Akiba
 

What's hot (20)

計算量
計算量計算量
計算量
 
AtCoder Beginner Contest 002 解説
AtCoder Beginner Contest 002 解説AtCoder Beginner Contest 002 解説
AtCoder Beginner Contest 002 解説
 
AtCoder Regular Contest 022 解説
AtCoder Regular Contest 022 解説AtCoder Regular Contest 022 解説
AtCoder Regular Contest 022 解説
 
AtCoder Regular Contest 034 解説
AtCoder Regular Contest 034 解説AtCoder Regular Contest 034 解説
AtCoder Regular Contest 034 解説
 
AtCoder Regular Contest 037 解説
AtCoder Regular Contest 037 解説AtCoder Regular Contest 037 解説
AtCoder Regular Contest 037 解説
 
Code Formula 2014 予選A 解説
Code Formula 2014 予選A 解説Code Formula 2014 予選A 解説
Code Formula 2014 予選A 解説
 
Arc041
Arc041Arc041
Arc041
 
AtCoder Regular Contest 025 解説
AtCoder Regular Contest 025 解説AtCoder Regular Contest 025 解説
AtCoder Regular Contest 025 解説
 
幾何コンテスト2013
幾何コンテスト2013幾何コンテスト2013
幾何コンテスト2013
 
CODE FESTIVAL 2014 本選 解説
CODE FESTIVAL 2014 本選 解説CODE FESTIVAL 2014 本選 解説
CODE FESTIVAL 2014 本選 解説
 
AtCoder Beginner Contest 034 解説
AtCoder Beginner Contest 034 解説AtCoder Beginner Contest 034 解説
AtCoder Beginner Contest 034 解説
 
Re永続データ構造が分からない人のためのスライド
Re永続データ構造が分からない人のためのスライドRe永続データ構造が分からない人のためのスライド
Re永続データ構造が分からない人のためのスライド
 
AtCoder Beginner Contest 023 解説
AtCoder Beginner Contest 023 解説AtCoder Beginner Contest 023 解説
AtCoder Beginner Contest 023 解説
 
すごい constexpr たのしくレイトレ!
すごい constexpr たのしくレイトレ!すごい constexpr たのしくレイトレ!
すごい constexpr たのしくレイトレ!
 
Indeedなう 予選A 解説
Indeedなう 予選A 解説Indeedなう 予選A 解説
Indeedなう 予選A 解説
 
AtCoder Beginner Contest 029 解説
AtCoder Beginner Contest 029 解説AtCoder Beginner Contest 029 解説
AtCoder Beginner Contest 029 解説
 
全域木いろいろ
全域木いろいろ全域木いろいろ
全域木いろいろ
 
AtCoder Beginner Contest 014 解説
AtCoder Beginner Contest 014 解説AtCoder Beginner Contest 014 解説
AtCoder Beginner Contest 014 解説
 
プログラミングコンテストでのデータ構造 2 ~動的木編~
プログラミングコンテストでのデータ構造 2 ~動的木編~プログラミングコンテストでのデータ構造 2 ~動的木編~
プログラミングコンテストでのデータ構造 2 ~動的木編~
 
Binary indexed tree
Binary indexed treeBinary indexed tree
Binary indexed tree
 

More from 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
 

More from 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設計と情報設計」
 

Recently uploaded

シグネチャで始めるRustプログラミング - Superteam Japan Developer Event
シグネチャで始めるRustプログラミング - Superteam Japan Developer Eventシグネチャで始めるRustプログラミング - Superteam Japan Developer Event
シグネチャで始めるRustプログラミング - Superteam Japan Developer Event
K Kinzal
 
RayPen Product Description Documentation - 2024.6.19
RayPen Product Description Documentation - 2024.6.19RayPen Product Description Documentation - 2024.6.19
RayPen Product Description Documentation - 2024.6.19
GrapeCity, inc.
 
Bhyve Management Daemon Version 3.0 on FreBSD
Bhyve Management Daemon Version 3.0 on FreBSDBhyve Management Daemon Version 3.0 on FreBSD
Bhyve Management Daemon Version 3.0 on FreBSD
Yuichiro Naito
 
RaySheetで解決できるシナリオ10選-業務改善に貢献する機能 - RaySheet Documentation
RaySheetで解決できるシナリオ10選-業務改善に貢献する機能 - RaySheet DocumentationRaySheetで解決できるシナリオ10選-業務改善に貢献する機能 - RaySheet Documentation
RaySheetで解決できるシナリオ10選-業務改善に貢献する機能 - RaySheet Documentation
GrapeCity, inc.
 
Solanaで始めるRustプログラミング - Superteam Japan Developer Event
Solanaで始めるRustプログラミング - Superteam Japan Developer EventSolanaで始めるRustプログラミング - Superteam Japan Developer Event
Solanaで始めるRustプログラミング - Superteam Japan Developer Event
K Kinzal
 
RaySheet Product Description Documentation - 2024.6.19
RaySheet Product Description Documentation - 2024.6.19RaySheet Product Description Documentation - 2024.6.19
RaySheet Product Description Documentation - 2024.6.19
GrapeCity, inc.
 
RayBarcode Product Description Documentation - 2024.6.19
RayBarcode Product Description Documentation - 2024.6.19RayBarcode Product Description Documentation - 2024.6.19
RayBarcode Product Description Documentation - 2024.6.19
GrapeCity, inc.
 
クラウドネイティブにおけるセキュアなソフトウェア・サプライ・チェーンの考え方とベストプラクティス.pdf
クラウドネイティブにおけるセキュアなソフトウェア・サプライ・チェーンの考え方とベストプラクティス.pdfクラウドネイティブにおけるセキュアなソフトウェア・サプライ・チェーンの考え方とベストプラクティス.pdf
クラウドネイティブにおけるセキュアなソフトウェア・サプライ・チェーンの考え方とベストプラクティス.pdf
TatsuyaHanayama
 

Recently uploaded (8)

シグネチャで始めるRustプログラミング - Superteam Japan Developer Event
シグネチャで始めるRustプログラミング - Superteam Japan Developer Eventシグネチャで始めるRustプログラミング - Superteam Japan Developer Event
シグネチャで始めるRustプログラミング - Superteam Japan Developer Event
 
RayPen Product Description Documentation - 2024.6.19
RayPen Product Description Documentation - 2024.6.19RayPen Product Description Documentation - 2024.6.19
RayPen Product Description Documentation - 2024.6.19
 
Bhyve Management Daemon Version 3.0 on FreBSD
Bhyve Management Daemon Version 3.0 on FreBSDBhyve Management Daemon Version 3.0 on FreBSD
Bhyve Management Daemon Version 3.0 on FreBSD
 
RaySheetで解決できるシナリオ10選-業務改善に貢献する機能 - RaySheet Documentation
RaySheetで解決できるシナリオ10選-業務改善に貢献する機能 - RaySheet DocumentationRaySheetで解決できるシナリオ10選-業務改善に貢献する機能 - RaySheet Documentation
RaySheetで解決できるシナリオ10選-業務改善に貢献する機能 - RaySheet Documentation
 
Solanaで始めるRustプログラミング - Superteam Japan Developer Event
Solanaで始めるRustプログラミング - Superteam Japan Developer EventSolanaで始めるRustプログラミング - Superteam Japan Developer Event
Solanaで始めるRustプログラミング - Superteam Japan Developer Event
 
RaySheet Product Description Documentation - 2024.6.19
RaySheet Product Description Documentation - 2024.6.19RaySheet Product Description Documentation - 2024.6.19
RaySheet Product Description Documentation - 2024.6.19
 
RayBarcode Product Description Documentation - 2024.6.19
RayBarcode Product Description Documentation - 2024.6.19RayBarcode Product Description Documentation - 2024.6.19
RayBarcode Product Description Documentation - 2024.6.19
 
クラウドネイティブにおけるセキュアなソフトウェア・サプライ・チェーンの考え方とベストプラクティス.pdf
クラウドネイティブにおけるセキュアなソフトウェア・サプライ・チェーンの考え方とベストプラクティス.pdfクラウドネイティブにおけるセキュアなソフトウェア・サプライ・チェーンの考え方とベストプラクティス.pdf
クラウドネイティブにおけるセキュアなソフトウェア・サプライ・チェーンの考え方とベストプラクティス.pdf
 

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