2021牛客寒假算法基础集训营1
一群小青蛙呱蹦呱蹦呱
唯一分解定理
对每个素数对最终答案的贡献分别计算。
对于素数2而言,最大的贡献是2^k*∗3(后面无法找到有k+1个2的贡献)。
对于大于2的素数p而言,最大的贡献是p^k∗2(后面无法找到有k+1个p的贡献)。
先线性筛出7.5e7以内的所有素数,然后统计每个素数的贡献后相乘即可。
#include<bits/stdc++.h>
using namespace std;
const int maxx=1e8+10;
const int mod=1e9+7;
typedef long long ll;
int s[maxx],f[maxx],cnt=0;
void su(){ //欧拉素数筛
memset(f,0,sizeof(f));
f[0]=f[1]=1;
for(int i=2;i<maxx;i++){
if(!f[i]){
s[cnt++]=i;
}
for(int j=0;j<cnt&&(i*s[j]<maxx);j++){
f[s[j]*i]=1;
if(i%s[j]==0) break;
}
}
}
int main(){
int n;cin>>n;
su();
ll temp=1;
ll sum=1;
if(n<=5){
cout<<"empty";
return 0;
}
while(temp*2<=n/3) temp*=2;
sum=sum*temp%mod;
for(int i=1;s[i]<=n/2;i++){
ll qq=1;
while(s[i]*qq<=n/2){
qq*=s[i];
}
sum=sum*qq%mod;
}
cout<<sum;
return 0;
}