Nowcoder9981J.一群小青蛙呱蹦呱蹦呱(线性筛素数)

链接:https://ac.nowcoder.com/acm/contest/9981/J
来源:牛客网

有n个格子,每个格子里有一个数,1,2,3,4...n

 

牛牛放出无穷只青蛙。
第一只青蛙的路线是:1->2->4->8->16->....
第二只青蛙的路线是:1->3->9->27->81->....
第三只青蛙的路线是:1->5->25->125....
第四只青蛙的路线是:1->7->49........
。。。。。。
用数学语言描述,第 只青蛙的路线是首项为1,公比为的等比数列,其中代表第个素数。
当青蛙跳到一个格子上,如果这个格子上面有一个数,青蛙就会把这个数吃掉。
牛牛想知道,所有没有被吃掉的数的lcm(最小公倍数 ,Least common multiple)是多少?
由于这个lcm可能非常大,请输出它对取模的值。
#include<bits/stdc++.h>
using namespace std;
const int maxn=1e8+100;
const int mod=1e9+7;
typedef long long ll;
int is[maxn];
int pr[maxn],tot;
int n;
int main () {
    scanf("%d",&n);
    if (n<=5) {
        printf("empty\n");
        return 0;
    }
    for (int i=1;i<=n/2;i++) is[i]=1;
    is[1]=0;
    for (int i=2;i<=n/2;i++) {
        if (is[i]) pr[tot++]=i;
        for (int j=0;j<tot&&1ll*i*pr[j]<=n/2;j++) {
            is[i*pr[j]]=0;
            if (i%pr[j]==0) break;
        }
    }
    long long ans=2;
    while (1) {
        if (ans*2>n/3) break;
        ans*=2;
    }
    ans%=mod;
    for (int i=0;i<tot;i++) {
        int x=pr[i];
        if (x==2) continue;
        int tt=x;
        while (1) {
            if (1ll*tt*x>n/2) break;
            tt*=x;
        }
        ans*=tt;
        ans%=mod;
    }
    printf("%lld\n",ans);
    
}

 

posted @ 2021-02-01 21:46  zlc0405  阅读(150)  评论(0编辑  收藏  举报