对于 [ 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 l≤r≤107。
可以看出在 [ 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+1n−cnt
(
n
−
k
n-k
n−k 个非关键点概率相同)
则最后一个关键点的位置期望
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)
n−cnt+1n−cnt=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;
}