fork download
  1. {-# LANGUAGE BangPatterns #-}
  2.  
  3. import Control.Monad (replicateM_)
  4. import Data.Word (Word8, Word32, Word64)
  5.  
  6. s :: Word64 -> Word32
  7. s x = go 3 0 1 2 0 x
  8. where
  9. go :: Word8 -> Word32 -> Word64 -> Word64 -> Word64 -> Word64 -> Word32
  10. go !n !sum !lcm1 !lcm2 !handled !x
  11. | handled == x = sum
  12. | lcm1 == lcm2 = go (n + 1) sum lcm1 (lcm lcm2 (fromIntegral n)) handled x
  13. | otherwise = let !itemsPerGroup = (lcm2 `quot` lcm1) - 1
  14. (!fullGroups, !remainder) = x `quotRem` lcm2
  15. !count = itemsPerGroup*fullGroups + remainder `quot` lcm1
  16. in go (n + 1) (fromIntegral ((fromIntegral sum + (fromIntegral (n - 1))*count) `rem` 1000000007)) lcm2 (lcm lcm2 (fromIntegral n)) (handled + count) x
  17.  
  18. main :: IO ()
  19. main = do
  20. count <- fmap read getLine
  21. replicateM_ count $ do
  22. print (s x)
Success #stdin #stdout 0s 5564KB
stdin
6
1
2
3
4
10
10000000000000000
stdout
2
5
7
10
26
366580019