Skip to content

Instantly share code, notes, and snippets.

@techno-tanoC
Created January 14, 2015 10:08
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save techno-tanoC/da34482b51ccb3cd2418 to your computer and use it in GitHub Desktop.
Save techno-tanoC/da34482b51ccb3cd2418 to your computer and use it in GitHub Desktop.
mod7占い (paizaランク S 相当)
import Control.Monad
import Control.Applicative
import Data.List
type Triple = (Int, Int, Int)
data Pat = Pat {
triple :: Triple,
mods :: [Int]
} deriving (Show)
combCounter n k = if k > 0 && n > 0 then n ^> k `div` k ^> k else 1
where
n ^> k = foldr (*) 1 [n-k+1..n]
count n = length . filter (== n)
mapMod xs = map (\i -> count i xs) [0..6]
pats :: [Pat]
pats = map patternize . nub . map sort $ [[x, y, z] | x <- [0..6], y <- [0..6], z <- [0..6], (x + y + z) `mod` 7 == 0]
where
patternize xs@(x:y:z:[]) = Pat (x, y, z) (mapMod xs)
calc :: ([Int], [Int]) -> Pat -> Int
calc x p = if (all compa zipped) then
product . map (\(x, y) -> combCounter x y) $ zipped
else 0
where
compa (x, y) = x >= y
zipped = zip (snd x) (mods p)
main = do
n <- readLn
mods <- sort . map (`mod` 7) <$> replicateM n readLn :: IO [Int]
let modMap = (mods, mapMod mods)
print $ sum . map (calc modMap) $ pats
mod7占い (paizaランク S 相当)
下記の問題をプログラミングしてみよう!
あなたは今、「mod7占い」というサービスを始めようと考えています。
mod7占いとは、整数が書かれた複数のカードの中から3枚を選び、そこに書かれた整数の和が7で割り切れるかどうかで運勢を決めようというものです。 カードは必ず異なる3枚を選ぶ必要があり、全てのカードには全て異なる数字が書かれています。
占いというからには、7で割り切れる組み合わせはそれなりに少なくする必要があります。 そこで、適当な複数のカードに対して、カードに書かれた3つの整数を足した和が7で割り切れるような組合せがいくつあるかを計算するプログラムを作成してください。
▼ 下記回答欄にコードを記入してみよう
入力される値
入力は以下のフォーマットで与えられます。
N
a_1
a_2
...
a_N
N は与えられるカードの枚数を表します。
a_i (1 ≦ i ≦ N) はi 枚目のカードに書かれた整数であり、スペース改行区切りでN 個与えられます。
入力値最終行の末尾に改行が1つ入ります。
文字列は標準入力から渡されます。 標準入力からの値取得方法はこちらをご確認ください
期待する出力
組合せ数を一行に出力してください。
最後は改行し、余計な文字、空行を含んではいけません。
条件
すべてのテストケースにおいて、以下の条件をみたします。
1 ≦ N ≦ 100000
0 ≦ a_i < 2^32
入力例1
3
10
4
14
出力例1
1
入力例2
10
1
2
3
4
5
6
7
8
9
10
出力例2
17
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment