import Control.Applicative ((<$>)) import Control.Monad (replicateM) import Data.ByteString.Char8 (ByteString) import Data.Char (isSpace) import Data.List (unfoldr, foldl') import qualified Data.ByteString.Char8 as B getIntList :: IO [Integer] getIntList = unfoldr f <$> B.getLine where f s = do (n, s') <- B.readInteger s return (n, B.dropWhile isSpace s') evalSittable :: [Integer] -> Integer evalSittable [c, d] | odd c = ((c `div` 2) + 1) * d | otherwise = (c `div` 2) * d solve :: [[Integer]] -> Integer solve xss = (foldl' (\acc -> \xs -> acc + evalSittable xs) 0 xss) `mod` 1000000007 main :: IO () main = do n <- readLn :: IO Int solve <$> replicateM n getIntList >>= print