zoukankan      html  css  js  c++  java
  • 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
    ");
            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
    ",ans);
        
    }
  • 相关阅读:
    linux安装mysql
    yum命令
    java启动jar包中的指定类
    linux系统配置参数修改
    iconfont阿里巴巴矢量图标库批量保存
    Python 使用Pandas读取Excel的学习笔记
    在Ubuntu18.04的Docker中安装Oracle镜像及简单使用
    Eclipse 安装PyDev开发Python及初步使用
    Python打包工具
    MacOS下打包Python应用
  • 原文地址:https://www.cnblogs.com/zhanglichen/p/14359223.html
Copyright © 2011-2022 走看看