#include<bits/stdc++.h>
#define int long long
using namespace std;
int l[600000],r[600000];
int kto[600000][2];
int drzewo[2000000];
int ile[600000];
int mod=1e9+7;
int pot=1;
bitset<60001> dp[60001];
int silniaa[600000];
int n;
void ustaw(int x,int y,int co)
{
x+=pot;
y+=pot;
drzewo[x]=co;
drzewo[y]=co;
while(x/2!=y/2)
{
if(x%2==0)
drzewo[x+1]=co;
if(y%2==1)
drzewo[y-1]=co;
x/=2;
y/=2;
}
}
int zap(int x)
{
int wynik=0;
x+=pot;
wynik=drzewo[x];
x/=2;
while(x>=1)
{
wynik=max(wynik,drzewo[x]);
x/=2;
}
return wynik;
}
int pow(int x,int y)
{
int wynik=1;
while(y>0)
{
if(y%2==1)
{
wynik*=x;
wynik%=mod;
}
x*=x;
x%=mod;
y/=2;
}
return wynik;
}
int bylo[600000];
int wynosi[600000];
int policz(int x)
{
if(bylo[x])
return wynosi[x];
int cos=silniaa[n-x-1];
int iloczyn=1;
for(int j=n-1;j>=n-x;j--)
iloczyn*=j,iloczyn%=mod;
int wynik=cos*iloczyn;
wynik%=mod;
for(int j=n-x-1;j>=1;j--)
{
iloczyn*=j;
iloczyn%=mod;
iloczyn*=pow(j+x,mod-2);
iloczyn%=mod;
wynik+=(iloczyn*cos)%mod;
wynik%=mod;
}
bylo[x]=1;
wynosi[x]=wynik;
return wynik;
}
int32_t main()
{
cin.tie(0);
cout.tie(0);
ios_base::sync_with_stdio(0);
cin>>n;
while(pot<=n*2)
pot*=2;
pot--;
silniaa[0]=1;
for(int i=1;i<=n;i++)
silniaa[i]=silniaa[i-1]*i,silniaa[i]%=mod;
for(int i=1;i<=n;i++)
cin>>l[i]>>r[i];
for(int i=1;i<=n;i++)
{
kto[i][0]=zap(l[i]);
kto[i][1]=zap(r[i]);
ustaw(l[i],r[i],i);
}
for(int i=n;i>=1;i--)
{
ile[i]=dp[i].count();
dp[i][i]=1;
dp[kto[i][0]]|=dp[i];
dp[kto[i][1]]|=dp[i];
}
int silnia=silniaa[n];
int wynik=0;
for(int i=1;i<=n;i++)
{
wynik+=policz(ile[i]);
wynik%=mod;
}
wynik*=pow(silnia,mod-2);
wynik%=mod;
cout<<wynik;
return 0;
}
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 109 110 111 112 113 114 115 116 117 118 119 120 121 | #include<bits/stdc++.h> #define int long long using namespace std; int l[600000],r[600000]; int kto[600000][2]; int drzewo[2000000]; int ile[600000]; int mod=1e9+7; int pot=1; bitset<60001> dp[60001]; int silniaa[600000]; int n; void ustaw(int x,int y,int co) { x+=pot; y+=pot; drzewo[x]=co; drzewo[y]=co; while(x/2!=y/2) { if(x%2==0) drzewo[x+1]=co; if(y%2==1) drzewo[y-1]=co; x/=2; y/=2; } } int zap(int x) { int wynik=0; x+=pot; wynik=drzewo[x]; x/=2; while(x>=1) { wynik=max(wynik,drzewo[x]); x/=2; } return wynik; } int pow(int x,int y) { int wynik=1; while(y>0) { if(y%2==1) { wynik*=x; wynik%=mod; } x*=x; x%=mod; y/=2; } return wynik; } int bylo[600000]; int wynosi[600000]; int policz(int x) { if(bylo[x]) return wynosi[x]; int cos=silniaa[n-x-1]; int iloczyn=1; for(int j=n-1;j>=n-x;j--) iloczyn*=j,iloczyn%=mod; int wynik=cos*iloczyn; wynik%=mod; for(int j=n-x-1;j>=1;j--) { iloczyn*=j; iloczyn%=mod; iloczyn*=pow(j+x,mod-2); iloczyn%=mod; wynik+=(iloczyn*cos)%mod; wynik%=mod; } bylo[x]=1; wynosi[x]=wynik; return wynik; } int32_t main() { cin.tie(0); cout.tie(0); ios_base::sync_with_stdio(0); cin>>n; while(pot<=n*2) pot*=2; pot--; silniaa[0]=1; for(int i=1;i<=n;i++) silniaa[i]=silniaa[i-1]*i,silniaa[i]%=mod; for(int i=1;i<=n;i++) cin>>l[i]>>r[i]; for(int i=1;i<=n;i++) { kto[i][0]=zap(l[i]); kto[i][1]=zap(r[i]); ustaw(l[i],r[i],i); } for(int i=n;i>=1;i--) { ile[i]=dp[i].count(); dp[i][i]=1; dp[kto[i][0]]|=dp[i]; dp[kto[i][1]]|=dp[i]; } int silnia=silniaa[n]; int wynik=0; for(int i=1;i<=n;i++) { wynik+=policz(ile[i]); wynik%=mod; } wynik*=pow(silnia,mod-2); wynik%=mod; cout<<wynik; return 0; } |
English