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