j题
两个数求最小质因数,除了两个数乘积除以两个最大公约数以外,我们可以用唯一分解定理,求出两个数相同质因子最高次数,然后相乘
例如2223 和2233 两者的最小公倍数即为22233
根据题意我们可得没被划掉的数有两种或两种以上的质因子,所以我们求出剩下数相同质因子的最高次数,因为有两种或以上的质因子,如果我们要求最大值
就假设为两个质因子,当我们求2这个质因子得最高次数时,我们可以让他乘个3,即pow(2,k)3<=n能得出k=log(n/3)/log2,其他的因子乘2就能得到最大值,我们最大只要筛到n/2即可 因为pmax2<=n(pmax表示素数),然后边求边取模.
#include"bits/stdc++.h"
using namespace std;
typedef long long ll;
ll n,mod=1e9+7,ans=1,num=1;
bool visit[80000005];
int p[10000005];
ll qpow(ll a,ll b){
ll res=1;
while(b){
if(b%2)res=(res*a)%mod;
b=b/2;
a=(a*a)%mod;
}
return res;
}
ll ca(ll a){
if(a==2) return qpow(a,floor(log(n/3)/log(2)));
return qpow(a,floor(log(n/2)/log(a)));
}
void get(){
for(int i=2;i<=n/2;i++){
if(visit[i]==0){
p[num++]=i;
ans=(ans*ca(i))%mod;
}
for(int j=1;j<num&&i*p[j]<=n/2;j++){
visit[i*p[j]]=1;
if(i%p[j]==0)break;
}
}
}
int main(){
cin>>n;
get();
cout<<ans%mod;
return 0;
}