#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int mod=1e8+7;
const int maxn=1e7+10;
/*
难点: 1.阶乘 这个数字会非常大,直接蒙逼,不知道怎样把这个数字降下来
2.条件的转化 题目要求我们求在 (M!,N!],之间所有的 最小素因子大于M的
solution:
2.要求最小素因子大于M的 <----> 这个数字和M!互质 -----> 欧拉函数,求出phi(M!) <------- 要知道gcd(a,b)==gcd(a%b,b),-----> 也就是说 可以直接计算 M!里面和M!互质的数量,然后直接乘N!/(M!),最后减一,因为要素因子要大于M么
1.难点在phi(*) 怎么做了,注意到
如果 M为素数,那么 phi(M!)=M!(1-1/M)*(...),phi((M-1)!)=(M-1)!*(...),所以phi(M!)=M*(1-1/M)*phi((M-1)!)
如果 M不是素数,那么phi(M!)=M*phi((M-1)!), 所以我们只需要计算fphi(1-1e7),就好了,这道题就解决了
阶乘提供了 整除;因子相乘 的好性质
*/
ll fphi[maxn];
int not_prime[maxn];
void get_prime(){
not_prime[1]=1;
for(ll i=2;i<maxn;i++){
if(!not_prime[i]){
for(ll j=i*i;j<maxn;j+=i)
not_prime[j]=1;
}
}
}
void get_phi(){
get_prime();
fphi[1]=1;
for(ll i=2;i<maxn;i++){
if(!not_prime[i])
fphi[i]=fphi[i-1]*(i-1)%mod;
else
fphi[i]=fphi[i-1]*i%mod;
}
}
int main()
{
get_phi();
int n,m;
while(scanf("%d %d",&n,&m)==2&&n){
ll ans=fphi[m];
for(ll i=m+1;i<=n;i++){
ans=ans*i%mod;
}
ans=(ans+mod-1)%mod;
printf("%lld\n",ans);
}
return 0;
}