Problem:
Score : 500 points

Problem Statement

#nck {
width: 30px;
height: auto;
}

There are N computers and N sockets in a one-dimensional world.
The coordinate of the i-th computer is a_i, and the coordinate of the i-th socket is b_i.
It is guaranteed that these 2N coordinates are pairwise distinct.

Snuke wants to connect each computer to a socket using a cable.
Each socket can be connected to only one computer.

In how many ways can he minimize the total length of the cables?
Compute the answer modulo 10^9+7.

Constraints

1 ≤ N ≤ 10^5

0 ≤ a_i, b_i ≤ 10^9

The coordinates are integers.

The coordinates are pairwise distinct.

Input

The input is given from Standard Input in the following format:

N
a_1
:
a_N
b_1
:
b_N

Output

Print the number of ways to minimize the total length of the cables, modulo 10^9+7.

Sample Input 1

2
0
10
20
30

Sample Output 1

2

There are two optimal connections: 0-20, 10-30 and 0-30, 10-20.
In both connections the total length of the cables is 40.

Sample Input 2

3
3
10
8
7
12
5

Sample Output 2

1

Solution in C# (Mono 4.6.2.0) (judge verdict: Wrong Answer)

using System;
using System.Linq;//リストの使用
using System.Collections.Generic;
class Program
{
	static void Main()
	{
		long n = long.Parse(Console.ReadLine());//int.Parseは文字列を整数に変換。
    long[][] nums = new long[2*n][];//座標と種類
    long memo = 0;
    long multiplyMemo = 1;
    long answer = 1;
    long mod = 1000000007;
    for(long i = 0; i < n; i++)
    {
      nums[i] = new long[2];
      nums[i][0] = long.Parse(Console.ReadLine());
      nums[i][1] = 0;
    }
    for(long i = n; i < 2*n; i++)
    {
      nums[i] = new long[2];
      nums[i][0] = long.Parse(Console.ReadLine());
      nums[i][1] = 1;
    }
    Array.Sort(nums, (a, b) => a[0].CompareTo(b[0]));
    for(long i = 0; i < 2*n; i++)
    {
      if(nums[i][1] == 0)
      {
        memo++;
        if(memo < -1) multiplyMemo *= DivideModReverse(-memo, mod);
        multiplyMemo %= mod;
        if(memo > 1)
        {
          multiplyMemo *= Math.Abs(memo)-1;
          multiplyMemo %= mod;
          answer += multiplyMemo*(Math.Abs(memo)-1);
        }
        answer %= mod;
      }
      else
      {
        memo--;
        if(memo > 1) multiplyMemo *= DivideModReverse(memo, mod);
        multiplyMemo %= mod;
        if(memo < -1)
        {
          multiplyMemo *= Math.Abs(memo)-1;
          multiplyMemo %= mod;
          answer += multiplyMemo*(Math.Abs(memo)-1);
        }
        answer %= mod;
      }
    }
    
		Console.WriteLine(answer);//WriteLineをWriteとすると、改行なしで出力。
	}

  static long DivideMod(long x, long a, long p)//戻り値はx^a(mod p)
  {
  long num = 2;
  long answer = 1;
  long check = a;
  long memo = x%p;
  
  while(check > 0)
    {
    if(check % num == num / 2)
      {
      check -= num / 2;
      answer *= memo;
      answer %= p;
      }
  memo *= memo;
  memo %= p;
  num *= 2;
    }
  return answer;
  }

static long DivideModReverse(long x, long p)//戻り値はx^-1(mod p), pは素数
  {
  long answer = DivideMod(x, p-2, p);
  return answer;
  }
  
}