📄 fractran.hs.txt
字号:
-- Problem Fractran-- Algorithm Simulation-- Runtime O(n)-- Author Walter Guttmann-- Date 2003.09.12import List;import Maybe;main :: IO ()main = do input <- readFile "fractran.in" mapM_ (putStrLn . concat . intersperse " " . map show . solve) $ cases $ map read $ words inputcases :: [Int] -> [(Int,PEs,E)]cases (0:_) = []cases (m:n:k:xs) = (m,toPEs n,toPEs2 fs) : cases gs where (fs,gs) = splitAt (2*k) xssolve :: (Int,PEs,E) -> [Int]solve (m,n0,fs) = take m [ log2 n | n <- iterate (step fs) n0 , is2power n ]step :: E -> PEs -> PEsstep fs n = head [ fromJust x `multiply` num | (num,den) <- fs , let x = n `divide` den , isJust x ]-- (prime number,exponent)type PE = (Int,Int)type PEs = [PE]type E = [(PEs,PEs)]primes :: [Int]primes = sieve [2..] where sieve :: [Int] -> [Int] sieve (p:xs) = p : sieve [ x | x <- xs , x `mod` p /= 0 ]toPEs :: Int -> PEstoPEs = toPEs' primes where toPEs' :: [Int] -> Int -> PEs toPEs' _ 1 = [] toPEs' (p:ps) x | x > 1 = let (ds,x':_) = span (\z -> z `mod` p == 0) $ iterate (`div` p) x lds = length ds in [ (p,lds) | lds > 0 ] ++ toPEs' ps x'toPEs2 :: [Int] -> EtoPEs2 [] = []toPEs2 (n:d:xs) = (toPEs n,toPEs d) : toPEs2 xsmultiply :: PEs -> PEs -> PEsmultiply xs [] = xsmultiply [] ys = ysmultiply ((xp,xe):xs) ((yp,ye):ys) = case compare xp yp of LT -> (xp,xe) : multiply xs ((yp,ye):ys) EQ -> (xp,xe+ye) : multiply xs ys GT -> (yp,ye) : multiply ((xp,xe):xs) ysdivide :: PEs -> PEs -> Maybe PEsdivide xs [] = Just xsdivide [] (y:ys) = Nothingdivide ((xp,xe):xs) ((yp,ye):ys) = case compare xp yp of LT -> case divide xs ((yp,ye):ys) of Nothing -> Nothing Just pes -> Just ((xp,xe) : pes) EQ -> case compare xe ye of LT -> Nothing EQ -> divide xs ys GT -> case divide xs ys of Nothing -> Nothing Just pes -> Just ((xp,xe-ye) : pes) GT -> Nothingis2power :: PEs -> Boolis2power pes = null [ e | (p,e) <- pes , p /= 2 ]log2 :: PEs -> Intlog2 [] = 0log2 [(2,e)] = e
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -