#include<bits/stdc++.h>
using namespace std;
namespace mine
{
typedef long long ll;
#define pr pair<int,int>
#define FR first
#define SE second
#define MP make_pair
#define PB push_back
#define vc vector
#define all(x) (x).begin(),(x).end()
#define sz(x) ((int)(x).size())
#define bin(x) (1ll<<(x))
#define GG(x) if(x) {puts("error");exit(666);}
#define fo(i,l,r) for(int i=(l),I=(r);i<=I;i++)
#define fd(i,r,l) for(int i=(r),I=(l);i>=I;i--)
ll qread()
{
ll ans=0,f=1;char c=getchar();
while(c<'0' or c>'9') {if(c=='-')f=-1;c=getchar();}
while('0'<=c and c<='9') ans=ans*10+c-'0',c=getchar();
return ans*f;
}
void write(ll num)
{
if(num<0) putchar('-'),num=-num;
if(num>=10) write(num/10);
putchar('0'+num%10);
}
void write1(ll num){write(num);putchar(' ');}
void write2(ll num){write(num);putchar('\n');}
template<typename T> void chmax(T &x,const T y) {x=(x>y?x:y);}
template<typename T> void chmin(T &x,const T y) {x=(x<y?x:y);}
ll gcd(ll x,ll y){return y?gcd(y,x%y):x;}
const int INF=0x3f3f3f3f;
const int MOD=1e9+7;
int mm(const int x){return x>=MOD?x-MOD:x;}
template<typename T> void add(T &x,const T &y){x=(x+y>=MOD?x+y-MOD:x+y);}
ll qpower(ll x,ll e,int mod=MOD){ll ans=1;GG(e<0)while(e){if(e&1)ans=ans*x%mod;x=x*x%mod;e>>=1;}return ans;}
ll invm(ll x){return qpower(x,MOD-2);}
const int N=1e6+10;
ll fac[N],inv[N],facinv[N];
int lg[N],n;ll ans=0;
vc<int> nn[30];
void solve()
{
ll now=1;int sum=0;
fo(t,0,20)
{
int siz=sz(nn[t]);if(!siz) break;
if(t==0) now=fac[siz];
else
{
ll x=1;fo(i,sum,sum+siz-1) x=x*(i+1)%MOD;
ll y=1;fo(i,sum,sum+siz-1) y=y*i%MOD;
now=now*mm(x+MOD-y)%MOD;
}
sum+=siz;nn[t].clear();
}
add(ans,now);
}
void solve2(int fir)
{
fo(num,1,n) {int cnt=0,tmp=num;while(tmp%2==0)cnt++,tmp/=2;nn[cnt].PB(num);}
solve();
}
void solve3(int fir)
{
int k=lg[fir/3];
fo(right,0,k)
{
fo(num,1,n) {
int cnt=0,tmp=num;while(tmp%2==0)cnt++,tmp/=2;
if(num%3==0) nn[cnt+(cnt>=right)].PB(num);
else nn[min(cnt,right)].PB(num);
}
solve();
// printf("right=%d ans=%lld\n",right,ans);
}
}
void main()
{
fo(i,2,N-1) lg[i]=lg[i>>1]+1;
fac[0]=1;fo(i,1,N-1) fac[i]=fac[i-1]*i%MOD;
inv[1]=1;fo(i,2,N-1) inv[i]=(MOD-MOD/i)*inv[MOD%i]%MOD;
facinv[N-1]=invm(fac[N-1]);fd(i,N-2,0) facinv[i]=facinv[i+1]*(i+1)%MOD;
n=qread();if(n==2){puts("1");return;}
solve2(bin(lg[n]));
// puts("");
if(lg[n/3]==lg[n]-1) solve3(bin(lg[n/3])*3);write(ans);
}
};//(ans+MOD)%MOD
signed main()
{
// freopen("a.in","r",stdin);
// freopen("a.out","w",stdout);
srand(time(0));
mine::main();
}