Created
January 14, 2015 10:08
-
-
Save techno-tanoC/da34482b51ccb3cd2418 to your computer and use it in GitHub Desktop.
mod7占い (paizaランク S 相当)
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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