Problem:
Score : 300 points

Problem Statement

The commonly used bills in Japan are 10000-yen, 5000-yen and 1000-yen bills. Below, the word "bill" refers to only these.

According to Aohashi, he received an otoshidama (New Year money gift) envelope from his grandfather that contained N bills for a total of Y yen, but he may be lying. Determine whether such a situation is possible, and if it is, find a possible set of bills contained in the envelope. Assume that his grandfather is rich enough, and the envelope was large enough.

Constraints

1 ≤ N ≤ 2000

1000 ≤ Y ≤ 2 × 10^7

N is an integer.

Y is a multiple of 1000.

Input

Input is given from Standard Input in the following format:

N Y

Output

If the total value of N bills cannot be Y yen, print -1 -1 -1.

If the total value of N bills can be Y yen, let one such set of bills be "x 10000-yen bills, y 5000-yen bills and z 1000-yen bills", and print x, y, z with spaces in between. If there are multiple possibilities, any of them may be printed.

Sample Input 1

9 45000

Sample Output 1

4 0 5

If the envelope contained 4 10000-yen bills and 5 1000-yen bills, he had 9 bills and 45000 yen in total. It is also possible that the envelope contained 9 5000-yen bills, so the output 0 9 0 is also correct.

Sample Input 2

20 196000

Sample Output 2

-1 -1 -1

When the envelope contained 20 bills in total, the total value would be 200000 yen if all the bills were 10000-yen bills, and would be at most 195000 yen otherwise, so it would never be 196000 yen.

Sample Input 3

1000 1234000

Sample Output 3

14 27 959

There are also many other possibilities.

Sample Input 4

2000 20000000

Sample Output 4

2000 0 0

Solution in Haskell (GHC 7.10.3) (judge verdict: Accepted)

{-# LANGUAGE ScopedTypeVariables #-}
import qualified Data.ByteString.Char8 as BS

main = do
  [n,y] :: [Int] <- map (read . BS.unpack) . BS.words <$> BS.getLine
  let result = [ (man,gosen,sen)
               -- man >= 0, gosen >= 0, sen >= 0
               -- n = man + gosen + sen
               -- y == 10000*man + 5000*gosen + 1000*sen
               -- <=> y == 10000*man + 5000*gosen + 1000*(n - man - gosen)
               -- <=> y == 9000*man + 4000*gosen + 1000*n
               -- <=> (y - 9000*man - 1000*n) `quotRem` 4000 == (gosen, 0)
               | man <- [max 0 (((y + 5000 - 1) `quot` 5000) - n) .. ((y - 1000*n) `quot` 9000)]
               -- man >= 0: OK
               , (gosen, 0) <- return ((y - 9000*man - 1000*n) `quotRem` 4000)
               -- gosen >= 0
               -- <=> y - 9000*man - 1000*n >= 0
               -- <=> y - 1000*n >= 9000*man
               -- <=> (y - 1000*n) `quot` 9000 >= man
               , let sen = n - man - gosen
               -- sen >= 0
               -- <=> n - man - gosen >= 0
               -- <=> n - man - ((y - 9000*man - 1000*n) `quot` 4000) >= 0
               -- <=> 4000*n - 4000*man - y + 9000*man + 1000*n >= 0
               -- <=> 5000*n + 5000*man - y >= 0
               -- <=> man >= ((y + 5000 - 1) `quot` 5000) - n
               ]
      check (man,gosen,sen) = man >= 0 && gosen >= 0 && sen >= 0 && n == man + gosen + sen && y == 10000*man + 5000*gosen + 1000*sen
  -- if not (all check result)
  --  then putStrLn "error"
  --  else return ()
  putStrLn $ unwords $ map show $ case result of
    (man,gosen,sen):_ -> [man,gosen,sen]
    [] -> [-1,-1,-1]