保证表没问题
#include <iostream>
#include <cstdio>
#include <bitset>
#include <vector>
using namespace std;
const int MAXN=1e6+5;
const int f[500]={0,1,4279041,78522927,97275812,6626498,90103459,19755829,89404363,31420837,78259116,79495350,63384896,76365496,77671792,60888616,14364168,69179499,73237343,47511561,98202707,9638787,8923490,19377161,14025453,83914297,99211028,91698985,11861010,41728948,85011248,2957451,96835040,13279739,65389333,35674577,69539515,43558531,90167843,65612508,96727630,84411969,10432978,81144826,76822534,44673268,48780356,42026053,71419640,925833,75468296,56122076,11730540,24214526,57670707,87561236,60795551,16258057,38969193,93135220,99449198,86687779,48716439,54282180,9747238,6014664,88132693,90624798,78394444,54259153,2424434,71634841,6763549,80339105,74090298,10910559,39590831,57807866,78084208,54389248,4052287,74604335,99190428,89368783,73470487,32097770,29222100,30538785,3048397,89311543,48798411,36895907,88691881,24323948,4724247,97882710,84490696,93965490,66087028,92642640,55440368};
const int b6e0=1e8+7;
const int m=1e6;
bitset <MAXN> p;
vector <int> pr;
void ola(int n)
{
p.set();
pr.clear();
p[1]=0;
for (int i=2;i<=n;++i)
{
if (p[i]) pr.push_back(i);
for (int j=0;j<pr.size()&&i*pr[j]<=n;++j)
{
p[i*pr[j]]=0;
if (i%pr[j]==0) break;
}
}
}
typedef long long ll;
ll calc(int p,int n)
{
ll ans=p;
while (ans*p<=n) ans*=p;
return ans;
}
int main()
{
// freopen("std.in","r",stdin);
// freopen("ex.out","w",stdout);
int n;
cin>>n;
int ans=1;
if (n<=m)
{
ola(n);
for (int i=0;i<pr.size();++i) ans=calc(pr[i],n)*ans%b6e0;
}
else
{
ola(m);
for (int i=0;i<pr.size();++i) ans=calc(pr[i],m)*ans%b6e0;
int id=(n-1)/m;
ans=1ll*ans*f[id]%b6e0;
ll L=id*m+1,R=n;
for (int i=0;i<=R-L;++i) p[i]=0;
for (int i=0;i<pr.size()&&pr[i]*pr[i]<=R;++i)
{
int l=L/pr[i]*pr[i];
if (l<L) l+=pr[i];
while (l<=R) p[l-L]=1,l+=pr[i];
}
for(int i=L;i<=R;++i)
if(!p[i-L]) ans=1ll*ans*i%b6e0;
// printf("%d\n",ans);
}
printf("%d",ans);
return 0;
}