提交时间:2024-10-23 08:22:56

运行 ID: 33821

// 80 #include<bits/stdc++.h> #define int long long #define PII pair<int,int> #define mp make_pair #define fir first #define sec second #define lc(p) ((p)<<1) #define rc(p) ((p)<<1|1) using namespace std; const int maxn=507; const int mod=1e9+7; int n; int l[maxn],r[maxn]; int tmp[maxn<<1],tot; int Len[maxn]; int dp[maxn][maxn]; inline int qpow(int a,int b){ int ans=1; while(b){ if(b&1)ans=ans*a%mod; a=a*a%mod; b>>=1; } return ans; } const int C(int n,int m){ if(m>(n>>1))m=n-m; int Z=1,M=1; for(int i=1;i<=m;i++)M=M*i%mod; for(int i=n;i>=n-m+1;i--)Z=Z*i%mod; return Z*qpow(M,mod-2)%mod; } int Binom[maxn][maxn]; signed main(){ios::sync_with_stdio(0);cin.tie(0);cout.tie(0); #ifndef ONLINE_JUDGE freopen("1.in","r",stdin); freopen("1.out","w",stdout); #endif cin>>n; for(int i=1;i<=n;i++){ cin>>l[i]>>r[i]; r[i]++; tmp[(i-1)<<1|1]=l[i],tmp[i<<1]=r[i]; } sort(tmp+1,tmp+(n<<1)+1); tot=unique(tmp+1,tmp+(n<<1)+1)-tmp-1; for(int i=1;i<tot;i++)Len[i]=tmp[i+1]-tmp[i]; for(int i=1;i<=n;i++){ l[i]=lower_bound(tmp+1,tmp+tot+1,l[i])-tmp; r[i]=lower_bound(tmp+1,tmp+tot+1,r[i])-tmp-1; } dp[0][tot]=1; for(int i=1;i<tot;i++){ for(int j=1;j<=n;j++)Binom[i][j]=C(Len[i]+j-1,j); } for(int i=1;i<=n;i++){ for(int j=l[i];j<=r[i];j++){ for(int k=i-1;k>=0;k--){ for(int p=l[i]+1;p<=tot;p++){ (dp[i][j]+=dp[k][p]*Binom[j][i-k]%mod)%=mod; } } } } int ans=0; for(int j=l[n];j<=r[n];j++)(ans+=dp[n][j])%=mod; cout<<ans<<endl; }