1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
#include <bits/stdc++.h>

using namespace std;

typedef long long LL;

vector<vector<int>> graf;
vector<vector<int>> odwr_graf;


const int N=1048576;
const LL m=1e9+7;

LL inv(LL a) {
    return a<=1 ? a:m-(m/a)*inv(m%a)%m;
}

LL silnia[N];

int S[2*N+100];

int ile_wchodzacych[N];

bool mark[N];

vector<int> odw;

void DFS(int u){
    mark[u]=true;
    odw.push_back(u);
    for(int i=0; i<odwr_graf[u].size(); i++){
        if(!mark[odwr_graf[u][i]]){
            DFS(odwr_graf[u][i]);
        }
    }
}



void update(int l, int r, int x){
    l+=N;
    r+=N+2;
    while(l+1!=r){
        if(l%2==0) S[l+1]=x;
        if(r%2==1) S[r-1]=x;
        l/=2;
        r/=2;
    }
}

int query(int x){
    x+=N+1;
    int wyn=0;
    for(; x!=0; x/=2) wyn=max(wyn, S[x]);
    return wyn;
}

int main()
{
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    
    int n, a, b;
    cin>>n;
    graf.resize(n+1);
    odwr_graf.resize(n+1);
    for(int i=1; i<=n; i++){
        cin>>a>>b;
        int x=query(a);
        int y=query(b);
        odwr_graf[x].push_back(i);
        graf[i].push_back(x);
        if(x!=y) odwr_graf[y].push_back(i);
        if(x!=y) graf[i].push_back(y);
        update(a, b, i);
    }
    
    /*for(int i=0; i<=n; i++){
        cerr<<i<<": ";
        for(int j=0; j<odwr_graf[i].size(); j++){
            cerr<<odwr_graf[i][j]<<' ';
        }
        cerr<<'\n';
    }*/
    silnia[0]=1;
    for(int i=1; i<=n; i++){
        silnia[i]=silnia[i-1]*i;
        silnia[i]%=m;
    }
    
    for(int i=1; i<=n; i++){
        DFS(i);
        ile_wchodzacych[i]=odw.size()-1;
        for(int i=0; i<odw.size(); i++) mark[odw[i]]=false;
        odw.clear();
    }
    
    LL wyn1=0;
    for(int i=1; i<=n; i++){
        wyn1+=silnia[n]*inv(ile_wchodzacych[i]+1);
        //cerr<<ile_wchodzacych[i]<<' ';
        wyn1%=m;
    }
    //cerr<<wyn1;
    cout<<(wyn1*inv(silnia[n]))%m;
    
    return 0;
}