using System;
using System.Collections.Generic;
using System.Linq;
namespace negalorendezes
{
class Program
{
static void Main(string[] args)
{
int n = int.Parse(Console.ReadLine());//darabszám beolvasása
long[] m=new long[100001];//megszámoljuk a számejegyek darabszámát
long mini = 100001;//a legkisebb elem
//az lapelképzelés az, hogy pl. 3 számot 4 (123,321,312,213) féleképpen tudunk kombinálni,
//de ha negatív előjelú is lehetnek 16 db (123 -123 -1-23,-1-2-3 | 213,-213,-2-13,-2-1-3 | 312 -312 -3-21 -3-2-1|| 321 -321 -3-21 -3-2-1),
//de ekkor ugyanaz a sorozat újra előfordulhat mivel visszalakítjuk pozitívvá
//így ismétlődések keletkezhetnek, ezt akkor keletketik, ha pl 1 2 3 számok esetén a -1 2 3=> 1 2 3 , -2 1 3=>2 1 3 =-2 -1 3
//ha a legkisebbet kihagyjuk akkor kobinációbúl akkor különbözö variációkat fogunk kapni
long[] a = Console.ReadLine().Split().Select(long.Parse).ToArray();//sor beolvasása
for (int i = 0; i < n; i++)//végi megyünk az elemeken
{
m[a[i]]++;//növeljük az étékét, megszámoljuk, hogy ez egyes számk, hognyszr szerpelnek
mini = Math.Min(mini, a[i]);//megatározzuk azt a számot, amely legissebb az értéke, ez kerül a pozitív elemek elejére
}
long db = 1;//az esetek darabszáma
// az 3 | 1 2 3 adathalmaznál a dict: 1 1,2 1, 3 1, mini=1
for (int i=0;i<m.Length; i++)//bejárjuk a dictionary-t
{
if (i != mini &m[i]!=0)//a minimális elemeket kizárjuk
{
db = db * (m[i] + 1) % 1000000007;//hogy a szám ne legyen túl nagy vesszük az osztási maradákát egy nagy számmal
//a darabszám+1 szer vehetjük a különböző értékeket, mert hagyhatjuk pozitnak mindegyiket,
//és állíthatunk 1,2..item.value darabot negatívra
}
}
//4= 2*2 ( -2 2=>213(-213) 123( 1 2 3), -3 3=>312(-3 1 2),321(-3 -2 1) a minimális elemet az 1-et kihagyjuk
Console.WriteLine(db);
Console.ReadKey();
}
}
}