版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/huangjingyuan107/article/details/83479317
题目
对区间
建线段树。线段树中每个区间都有它自己的深度。
众所周知, 一个区间
可以拆成log个区间。
问
的期望。
对于一个区间
,
表示
个区间中包含L的那个区间的深度+
个区间中包含R的那个区间的深度。如果只有1个区间,那么那个区间的深度算2次。
正解
40分:式子很容易就写出来了。
100分:找规律。或者优化40分的式子。
找规律:对于所有的
数出每个区间遍历的次数。
可以得出结论:深度为i的区间总共被遍历了
次。
所以
一个等差比数列。
代码
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#define LL long long
#define mo 1000000007
#define fo(i,a,b) for(i=a;i<=b;i++)
using namespace std;
LL ans,w,w1;
LL m1,m2,m3,n;
LL calc(LL x){return (x*(x+1)%mo)*500000004%mo;}
LL ksm(LL x,LL y){
LL rs=1;
for(;y;y>>=1,x=(x*x)%mo)if(y&1)rs=(rs*x)%mo;
return rs;
}
int main(){
scanf("%lld",&n);
m1=ksm(2,n-1);
m2=m1*2%mo;
m3=m2*2%mo;
ans=(ans+(n%mo)*m3%mo-2+mo)%mo;
w1=(4*(m1-1))%mo;
ans=(ans-w1+mo)%mo;
w1=(m1+1)%mo;
ans=(ans*w1)%mo;
w=calc(m2);
ans=(ans*ksm(w,mo-2))%mo;
printf("%lld",ans);
return 0;
}