题目链接
F-美丽的序列I
做法:
题解没说有一种情况是多余计算的,
就是交叉的情况
#include<bits/stdc++.h>
#define rep(i,a,b) for(int i=a;i<=(b);++i)
#define mem(a,x) memset(a,x,sizeof(a))
#define pb push_back
#define pi pair<int, int>
#define mk make_pair
using namespace std;
typedef long long ll;
const ll mod=1e9+7;
ll gcd(ll a,ll b) { return b?gcd(b,a%b):a;}
ll powmod(ll a,ll b) {ll res=1;a%=mod;
assert(b>=0); for(;b;b>>=1){if(b&1)res=res*a%mod;a=a*a%mod;}return res;}
const int N=1e5+10;
int n;
ll l[N],r[N],tot,inv[N],len[N];
ll s(ll n)
{
n%=mod;
return (n*(n+1)/2)%mod;
}
int main()
{
cin>>n;
rep(i,1,n) scanf("%lld%lld",&l[i],&r[i]);
tot=1;
rep(i,1,n)
{
len[i]=r[i]-l[i]+1;
tot=tot*len[i]%mod;
inv[i]=powmod(len[i],mod-2);
}
ll ans=tot;
rep(i,2,n)
{
ll mi=min(r[i],r[i-1]);
if(l[i]>mi) continue;
ll val=0;
ll c=min(l[i-1]-1,mi);
if(c>=l[i])//交叉的情况 去掉重复的
{
val-=(l[i-1]-1)*(c-l[i]+1);
val%=mod;
val+=s(c)-s(l[i]-1);
}
val+=(mi-l[i]+1)*r[i-1]%mod;
val%=mod;
val-=s(mi)-s(l[i]-1);
val%=mod;
val*=(tot*inv[i]%mod*inv[i-1]%mod);val%=mod;
ans+=val;ans%=mod;
}
ans+=mod;ans%=mod;
cout<<ans<<endl;
}