#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; } |