code:
#include <cstdio> #include <algorithm> #define ll long long #define M 1000006 #define N 10000002 #define mod 1000000007 #define setIO(s) freopen(s".in","r",stdin) using namespace std; bool vis[N]; int fac[N],prime[M],inv[N],tot,n,T; int qpow(int x,int y) { int tmp=1; for(;y;y>>=1,x=(ll)x*x%mod) if(y&1) tmp=(ll)tmp*x%mod; return tmp; } void Init(int L,int R) { int i,j; for(i=2;i<=R;++i) { if(!vis[i]) { prime[++tot]=i; if(1<L&&i>=L) ++T; } for(j=1;j<=tot&&prime[j]*i<=R;++j) { vis[i*prime[j]]=1; if(prime[j]<L&&i<L&&prime[j]*i>=L) ++T; if(i%prime[j]==0) break; } } if(L==1) T=1; fac[0]=1; for(i=1;i<=R;++i) fac[i]=(ll)fac[i-1]*i%mod; inv[R]=qpow(fac[R],mod-2); for(i=R;i;--i) inv[i-1]=(ll)inv[i]*i%mod; } int C(int x,int y) { if(x<0||y<0||x<y) return 0; return (ll)fac[x]*inv[y]%mod*inv[x-y]%mod; } int main() { // setIO("input"); int i,j,l,r; scanf("%d%d",&l,&r),n=r-l+1; Init(l,r); int ans=0; for(i=T;i<=n;++i) { int tmp=(ll)C(n-T,n-i)*fac[n-i]%mod*fac[i-1]%mod*T%mod; ans=(ll)(ans+(ll)tmp*i%mod)%mod; } printf("%d\n",ans); return 0; }