Could some one please tell me why this code is getting time limit exceed. This sequence is sum of F_3 + F_7 + F_11 .... + F_(4n+3) = F_2n*F_(2n+1) . Is time limit too tight for Haskell or i am missing some thing.
Thank you
import Data.List
import qualified Data.ByteString.Char8 as BS
--matmul ::(Integral a ) => [[a]] -> [[a]] -> a -> [[a]]
--matmul a b m = ( map.map ) ( \x -> mod x m ) $ map ( \x -> map ( sum.zipWith (*) x ) ( transpose b ) ) a
matmul :: [Integer] -> [Integer] -> Integer -> [Integer]
matmul [a,b,c,d] [e,f,g,h] m = [u,v,w,x] where
u = mod ( a*e + b*g ) m
v = mod ( a*f + b*h ) m
w = mod ( c*e + d*g ) m
x = mod ( c*f + d*h ) m
powM ::[Integer] -> Integer -> Integer -> [Integer]
powM a n m | n == 1 = a
| n == 2 = matmul a a m
| even n = powM ( matmul a a m ) ( div n 2 ) m
| otherwise = matmul a ( powM ( matmul a a m ) ( div n 2 ) m ) m
readInt :: BS.ByteString -> Integer
readInt x = case BS.readInteger x of
Just ( i , _ ) -> i
Nothing -> error " upseperable ints "
solve::Integer -> BS.ByteString
solve n = BS.pack.show $ c*d where
[c,_,d,_] = powM [1,1,1,0] (2*n) 1000000007
--([_,a,_]:_) = powM [[1,2,1],[0,5,3],[0,3,2]] n 1000000007
-- f_3+f_7+f_11+f_15 = f_2n*f_(2n+1)
main = BS.interact $ BS.unlines. map ( solve.readInt ) . tail . BS.lines
created
last reply
- 8
replies
- 1.4k
views
- 5
users
- 1
link