5928. 【NOIP2018模擬10.26】蘋果
阿新 • • 發佈:2018-11-01
題目
對區間
建線段樹。線段樹中每個區間都有它自己的深度。
眾所周知, 一個區間
可以拆成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;
}