{-# LANGUAGE BangPatterns #-} import Control.Monad (replicateM_) import Data.Word (Word8, Word32, Word64) s :: Word64 -> Word32 s x = go 3 0 1 2 0 x where go :: Word8 -> Word32 -> Word64 -> Word64 -> Word64 -> Word64 -> Word32 go !n !sum !lcm1 !lcm2 !handled !x | handled == x = sum | lcm1 == lcm2 = go (n + 1) sum lcm1 (lcm lcm2 (fromIntegral n)) handled x | otherwise = let !itemsPerGroup = (lcm2 `quot` lcm1) - 1 (!fullGroups, !remainder) = x `quotRem` lcm2 !count = itemsPerGroup*fullGroups + remainder `quot` lcm1 in go (n + 1) (fromIntegral ((fromIntegral sum + (fromIntegral (n - 1))*count) `rem` 1000000007)) lcm2 (lcm lcm2 (fromIntegral n)) (handled + count) x main :: IO () main = do count <- fmap read getLine replicateM_ count $ do x <- fmap read getLine print (s x)