一群小青蛙呱蹦呱蹦呱

青蛙不会踩到的数一定是由两种以上质因子的,我们用p1-pn表示不同的质因子,那么这些不会踩到的数就可以表示为p1^a1 * p2^b1 或者 p1^a2 * p2^b2 p3^c1 等等
要对这些数求lcm,我们假设只存在两个不会踩到的数,分别为 p1^a2 * p2^b2 *p3^c2 和p1^a1 * p2^b1 *p3^c1 ,那么他们的lcm 就是p1^(max(a1,a2)) *p2^(max(b1,b2)) *p3(max(c1,c2)) ,所有对于不同的数,我们只需要求出每个质因子的最高次数即可。对于2这个质因子,如果一个数存在不只2这个质因子,而且要让2出现的次数最多,那么这个数就要满足2^k
3<=n 只有2 和 3 这两个质因子的话,2出现的次数才可能更多,再多出一个质因子,2出现的次数就会减少。对于大于2的质因子要想让他们出现的次数多,假设这个数是x,那么需要满足 x^k*2<=n,因为2是最小的质因数,让x *2就是为了让x 出现的次数尽可能的多

#include<bits/stdc++.h>
using namespace std;
const long long mod=1e9+7;
int temp[10000000];
bool arr[80000100];
int cnt=0;
int n;
long long kum(int x,int y){
    long long res=1;
    long long t=x;
    while(y){
        if(y&1){
            res=t*res%mod;
        }
        t=t*t%mod;
        y>>=1;
    }
    return res;
}
long long cal(int x){
    if(x==2)
        return kum(2,floor(log(n/3)/log(2)));
    else
        return kum(x,floor(log(n/2)/log(x)));
}
int main(){

    cin>>n;
    long long ans=1;
    memset(arr,1,sizeof(arr));
    for(int i=2;i<=n/2;i++){
        if(arr[i]){
            temp[cnt++]=i;
            ans=(ans*cal(i))%mod;
        }
        for(int j=0;j<cnt&&i*temp[j]<=n/2;j++){
            arr[i*temp[j]]=0;
            if(i%temp[j]==0)break;
        }    
    }
    if(ans==1)cout<<"empty";
    else cout<<ans;

    return 0;
}
题解汇总 文章被收录于专栏

全部评论

相关推荐

比亚迪深圳规划院 产品经理 0.9×1.36×12
点赞 评论 收藏
转发
点赞 收藏 评论
分享
牛客网
牛客企业服务