#include <bits/stdc++.h>
using namespace std;
int vis[1000010];
const int mod=1e9+7;
int main()
{
long long n,m,i,j;
while(~scanf("%d%d",&n,&m))
{
//memset(vis,0,sizeof(vis));
fill(vis,vis+n+1,0);
long long mul=1;
if(m%2==0){//求质因数
for(j=4;j<=n;j+=2)
{
vis[j]=1;
}
while(m%2==0)
m/=2;
vis[2]=1;
}
for(i=3;i<=sqrt(m);i+=2)
{
if(m%i==0)
{
vis[i]=1;
while(m%i==0)
m/=i;
for(j=1;;j++)
{
if(i*j<=n)
vis[i*j]=1;
else
break;
}
}
}
if(m>2)
{
for(j=1;;j++)
{
if(m*j<=n)
vis[m*j]=1;
else
break;
}
}
for(i=1;i<=n;i++)
{
if(vis[i]==0)
{
mul*=i;
mul%=mod;
}
}
printf("%lld\n",mul);
}
}
快速求质因数
最新推荐文章于 2024-01-19 18:41:06 发布