[数学期望]P4562

对于 [ l , r ] [l,r] [l,r] 内的数,对于其中的一个 i i i 进行操作,会使所有 i i i 的倍数被操作。求使所有的数被操作的所有顺序中操作次数之和模 1 0 9 + 7 10^9+7 109+7 的余数。 l ≤ r ≤ 1 0 7 l\leq r\leq 10^7 lr107


可以看出在 [ l , r ] [l,r] [l,r] 区间内分为关键点(代码中用 m u s t must must 表示)和非关键点,其中关键点是所有在 [ l , r ] [l,r] [l,r] 内没有其他约数的点。所有员工都认真工作的充要条件是所有关键点被遍历。

设有 c n t cnt cnt 个关键点,考虑一个非关键点在所有关键点后面的概率为
1 c n t + 1 \frac{1}{cnt+1} cnt+11
(所有关键点将区间分为 c n t + 1 cnt+1 cnt+1段,则只有选到最后一段才是在所有点之后)

则排在所有关键点后的非关键点个数期望为
n − c n t c n t + 1 \frac{n-cnt}{cnt+1} cnt+1ncnt
n − k n-k nk 个非关键点概率相同)

则最后一个关键点的位置期望
n − n − c n t c n t + 1 = n × c n t + c n t c n t + 1 = c n t c n t + 1 × ( n + 1 ) n-\frac{n-cnt}{cnt+1}=\frac{n\times cnt+cnt}{cnt+1}=\frac{cnt}{cnt+1}\times(n+1) ncnt+1ncnt=cnt+1n×cnt+cnt=cnt+1cnt×(n+1)
(用点的总个数减去在所有关键点后的非关键点期望个数)

所以 a n s ans ans 是期望值乘情况数
c n t c n t + 1 × ( n + 1 ) ! \frac{cnt}{cnt+1}\times(n+1)! cnt+1cnt×(n+1)!

#include<bits/stdc++.h>
#define ll long long
#define P 1000000007
ll l,r,cnt,ans=1;

ll Mul(ll a,ll b){
	ll ret=1;
	while(b){
		if(b&1){
			ret=ret*a%P;
		}
		b>>=1;
		a=a*a%P;
	}
	return ret;
}

bool must[10000005];
int main(){
	scanf("%lld %lld",&l,&r);
	for(int i=l;i<=r;++i){
		if(must[i]==0){
			cnt++;
			for(int j=i*2;j<=r;j+=i){
				must[j]=1;
			}
		}
	}
	for(int i=1;i<=r-l+2;++i){
		ans=ans*i%P;
	}
	printf("%lld",(((ans*cnt)%P)*Mul(cnt+1,P-2))%P);
	return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值