Submission #421856


Source Code Expand

{-# OPTIONS_GHC -O2 -funbox-strict-fields #-}
{-# LANGUAGE CPP #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE UnboxedTuples #-}
{-# LANGUAGE BangPatterns #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE NumDecimals #-}
{-# LANGUAGE DisambiguateRecordFields #-}
{-# LANGUAGE RecordWildCards #-}
{-# LANGUAGE NamedFieldPuns #-}
{-# LANGUAGE ViewPatterns #-}
{-# LANGUAGE DeriveDataTypeable #-}
{-# LANGUAGE DeriveFunctor #-}
{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE ExistentialQuantification #-}
{-# LANGUAGE MagicHash #-}
{-# LANGUAGE TupleSections #-}
{-# LANGUAGE RankNTypes #-}
{-# LANGUAGE ExplicitForAll #-}

import Control.Applicative
import Data.Bits
import qualified Data.ByteString.Char8 as BS
import qualified Data.Vector.Unboxed as U

main :: IO ()
main = do
  n <- getInt
  abbs <- U.replicateM n getInt2
  U.mapM_ print $ solve32 abbs

solve32 :: U.Vector (Int, Int) -> U.Vector Int
solve32 (U.unzip -> (as, bs)) =
  take_ (2 * U.length as) $
  U.drop 1 $
  convolve32 (U.cons 0 as) (U.cons 0 bs)
  where
    take_ k v
      | U.length v > k = U.take k v
      | otherwise = v U.++ U.replicate (k - U.length v) 0

convolve32 :: U.Vector Int -> U.Vector Int -> U.Vector Int
convolve32 as bs
  | U.null as || U.null bs = U.empty
convolve32 as bs = dec (enc as * enc bs :: Integer)
  where
    enc vec
      | len == 1 = fromIntegral $ U.head vec
      | otherwise = enc (U.take hlen vec) +
          enc (U.drop hlen vec) `shiftL` (hlen * 32)
      where
        !len = U.length vec
        hlen = div len 2
    dec n = U.generate (cdiv len 32) $ \i ->
      U.sum $ U.generate 32 $ \j ->
        if testBit n (32 * i + j)
          then 1 `shiftL` j
          else 0
      where
        len = findFirst (-1) 1e9 $ (==0) . shiftR n

----------------------------------------------------------------------------
-- IO

getInt :: IO Int
getInt = readInt <$> BS.getLine

readInt :: BS.ByteString -> Int
readInt s = case BS.readInt s of
  Just (r, "") -> r
  _ -> error $ "not an integer: " ++ show s

getInt2 :: IO (Int, Int)
getInt2 = readInt2 <$> BS.getLine

readInt2 :: BS.ByteString -> (Int, Int)
readInt2 s = (v0, v1)
  where
    !v = readIntsN 2 s
    !v0 = U.unsafeIndex v 0
    !v1 = U.unsafeIndex v 1

readIntsN :: Int -> BS.ByteString -> U.Vector Int
readIntsN n s0
  | U.length vec == n = vec
  | otherwise = error $ "readIntsN: expecting " ++ show n
    ++ " ints but got " ++ show (U.length vec)
  where
    vec = U.unfoldrN (n+1) step s0
    step (BS.dropWhile (==' ') -> s)
      | s == "" = Nothing
      | Just (v, r) <- BS.readInt s = Just (v, r)
      | otherwise = error $ "not an integer: " ++ show s

----------------------------------------------------------------------------
-- Util

infixl 7 `cdiv`
cdiv :: Int -> Int -> Int
cdiv a b = div (a + b - 1) b

----------------------------------------------------------------------------
-- BinSearch

findFirst :: Int -> Int -> (Int -> Bool) -> Int
findFirst lo hi f -- precondition: not (f lo) && f hi
  | hi - lo == 1 = hi
  | otherwise = let
    !mid = (lo + hi) `shiftR` 1
    in case f mid of
      True -> findFirst lo mid f
      False -> findFirst mid hi f

Submission Info

Submission Time
Task C - 高速フーリエ変換
User mkotha
Language Haskell (Haskell Platform 2014.2.0.0)
Score 100
Code Size 3158 Byte
Status AC
Exec Time 523 ms
Memory 12752 KB

Judge Result

Set Name Sample All
Score / Max Score 0 / 0 100 / 100
Status
AC × 1
AC × 33
Set Name Test Cases
Sample 00_sample_01
All 00_sample_01, 01_00_01, 01_01_19, 01_02_31, 01_03_22, 01_04_31, 01_05_40, 01_06_15, 01_07_39, 01_08_28, 01_09_30, 01_10_23, 01_11_33, 01_12_11, 01_13_28, 01_14_41, 01_15_26, 01_16_49, 01_17_34, 01_18_02, 01_19_33, 01_20_29, 02_00_51254, 02_01_82431, 02_02_17056, 02_03_34866, 02_04_6779, 02_05_65534, 02_06_65535, 02_07_65536, 02_08_65537, 02_09_65538, 02_10_100000
Case Name Status Exec Time Memory
00_sample_01 AC 31 ms 1328 KB
01_00_01 AC 31 ms 1104 KB
01_01_19 AC 33 ms 1420 KB
01_02_31 AC 32 ms 1356 KB
01_03_22 AC 33 ms 1424 KB
01_04_31 AC 32 ms 1432 KB
01_05_40 AC 33 ms 1564 KB
01_06_15 AC 31 ms 1360 KB
01_07_39 AC 32 ms 1488 KB
01_08_28 AC 32 ms 1364 KB
01_09_30 AC 32 ms 1364 KB
01_10_23 AC 32 ms 1420 KB
01_11_33 AC 32 ms 1360 KB
01_12_11 AC 32 ms 1368 KB
01_13_28 AC 32 ms 1416 KB
01_14_41 AC 32 ms 1492 KB
01_15_26 AC 31 ms 1436 KB
01_16_49 AC 35 ms 1520 KB
01_17_34 AC 33 ms 1360 KB
01_18_02 AC 31 ms 1276 KB
01_19_33 AC 32 ms 1360 KB
01_20_29 AC 33 ms 1364 KB
02_00_51254 AC 278 ms 6356 KB
02_01_82431 AC 447 ms 9940 KB
02_02_17056 AC 115 ms 3924 KB
02_03_34866 AC 200 ms 5332 KB
02_04_6779 AC 66 ms 2512 KB
02_05_65534 AC 364 ms 9812 KB
02_06_65535 AC 360 ms 9812 KB
02_07_65536 AC 371 ms 9680 KB
02_08_65537 AC 372 ms 9808 KB
02_09_65538 AC 371 ms 10196 KB
02_10_100000 AC 523 ms 12752 KB