Problem:
Reflection

For given three points p1, p2, p, find the reflection point x of p onto p1p2.

Input

xp1 yp1 xp2 yp2
q
xp0 yp0
xp1 yp1
...
xpq−1 ypq−1

In the first line, integer coordinates of p1 and p2 are given. Then, q queries are given for integer coordinates of p.

Output

For each query, print the coordinate of the reflection point x. The output values should be in a decimal fraction with an error less than 0.00000001.

Constraints

1 ≤ q ≤ 1000

-10000 ≤ xi, yi ≤ 10000

p1 and p2 are not identical.

Sample Input 1

0 0 2 0
3
-1 1
0 1
1 1

Sample Output 1

-1.0000000000 -1.0000000000
0.0000000000 -1.0000000000
1.0000000000 -1.0000000000

Sample Input 2

0 0 3 4
3
2 5
1 4
0 3

Sample Output 2

4.2400000000 3.3200000000
3.5600000000 2.0800000000
2.8800000000 0.8400000000

Solution in Haskell (judge verdict: Accepted)

import           Control.Applicative
import           Control.Monad
import qualified Data.ByteString.Char8 as B
import           Text.Printf

readi :: B.ByteString -> Int
readi b | Just (n, _) <- B.readInt b = n

type Vector = (Double, Double)

add :: Vector -> Vector -> Vector
add (a, b) (c, d) = (a + c, b + d)

sub :: Vector -> Vector -> Vector
sub (a, b) (c, d) = (a - c, b - d)

mult :: Vector -> Double -> Vector
mult (a, b) k = (k * a, k * b)

dot :: Vector -> Vector -> Double
dot (a, b) (c, d) = a * c + b * d

norm :: Vector -> Double
norm (a, b) = a * a + b * b

project :: Vector -> Vector -> Vector -> Vector
project (a, b) (c, d) (e, f) = (a, b) `add` (base `mult` r)
  where
    base = (c - a, d - b)
    hypo = (e - a, f - b)
    r = (hypo `dot` base) / norm base

reflect :: Vector -> Vector -> Vector -> Vector
reflect p1 p2 p = p `add` ((project p1 p2 p `sub` p) `mult` 2.0)

main :: IO ()
main = do
    [a,b,c,d] <- fmap (fromIntegral . readi) . B.words <$> B.getLine
    q <- readLn
    let p1 = (a, b)
    let p2 = (c, d)
    replicateM_ q $ do
        [x, y] <- fmap (fromIntegral . readi) . B.words <$> B.getLine
        let (ax, ay) = reflect p1 p2 (x, y)
        printf "%.8f %.8f\n" ax ay