#include using namespace std; const int kMod = 1e9 + 7; namespace ModOps { int add(int a, int b) { a += b; if(a >= kMod) a -= kMod; return a; } int sub(int a, int b) { a -= b; if(a < 0) a += kMod; return a; } int mul(int a, int b) { return 1LL * a * b % kMod; } int lgpow(int b, int e) { int r = 1; while(e) { if(e % 2) r = mul(r, b); b = mul(b, b); e /= 2; } return r; } int inv(int x) { return lgpow(x, kMod - 2); } }; using namespace ModOps; int Fact[1000005], IFact[1000005]; void Precomp() { Fact[0] = IFact[0] = 1; for(int i = 1; i <= 1000000; ++i) { Fact[i] = mul(Fact[i - 1], i); } IFact[1000000] = inv(Fact[1000000]); for(int i = 999999; i >= 1; --i) { IFact[i] = mul(IFact[i + 1], i + 1); assert(mul(IFact[i], Fact[i]) == 1); } } int GetComb(int n, int k) { return mul(mul(Fact[n], IFact[k]), IFact[n - k]); } int Cnt[1000005]; int main() { int n; cin >> n; for(int i = 0; i < n; ++i) { int x; cin >> x; Cnt[x] += 1; } Precomp(); for(int i = 0; i <= 5; ++i) { for(int j = 0; j <= i; ++j) cerr << GetComb(i, j) << " "; cerr << endl; } int ans = 1; for(int i = 1; i <= 1000000; ++i) { int now = 0; for(int j = 0; j <= Cnt[i]; ++j) { int comb = GetComb(Cnt[i], j); now = add(now, mul(comb, comb)); } ans = mul(ans, now); } cout << sub(ans, 1) << endl; return 0; }