牛客小白月赛23(F)

题目链接

 

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;

}
发布了498 篇原创文章 · 获赞 66 · 访问量 4万+

猜你喜欢

转载自blog.csdn.net/qq_41286356/article/details/105031414