zoukankan      html  css  js  c++  java
  • LCM from 1 to n

    连接:https://www.cnblogs.com/outerform/p/5921945.html

    若n+1不是 质数的完全平方,则可将质因数分解成p1^a1*p2^a2*……pn^an,对于每个pi^ai,显然<n,且两两互质,所以p1^a1*p2^a2*……pn^an|L(n),所以n+1|L(n),L(n +1)=L(n)

    若n+1是质数的完全平方,则n+1=p^k,p^k不整除1….n,p^k不整除L(n),因为p^(k-1)|L(n),所以p^(k-1)*p|L(n)*p,所以L(n+1)=L(n)*p。

    筛法求素数时用位图压缩节省空间。

    预处理出素数后然后再处理出一个前缀积,然后从小到大枚举幂次,通过二分查找该幂次下最大的素数是多少,每次答案乘上这个前缀和即可。

    unsigned int 自动对2^32取模

    #include<iostream>
    #include<cstdio>
    #include<algorithm>
    #include<cmath>
    #include<cstring>
    #include<queue>
    #include<set>
    #include<map>
    #include<vector>
    #include<bitset>
    
    #define int unsigned int
    #define inf 0x3f3f3f3f
    #define mem(a,b) memset(a,b,sizeof(a))
    #define ll long long
    #define sd(x) scanf("%d",&(x))
    #define sl(x) scanf("%lld",&(x))
    #define slf(x) scanf("%lf",&(x))
    #define scs(s) scanf("%s",s)
    #define rep(i,a,b) for(int i=a;i<=b;i++)
    #define per(i,a,b) for(int i=a;i>=b;i--)
    #define lowbit(x) x&(-x)
    #define ls now<<1
    #define rs now<<1|1
    #define lson l,mid,ls
    #define rson mid+1,r,rs
    
    using namespace std;
    
    const int maxn=6e6+10;
    
    bitset<100000010> is_prime;
     int ans,sum[maxn];
     int prime[maxn],tot=0;
    
    void oula()
    {
        is_prime[1]=is_prime[0]=1;
        rep(i,2,1e8)
        {
            if(!is_prime[i]) prime[++tot]=i;
            for(int j=1;j<=tot&&i*prime[j]<=1e8;j++)
            {
                is_prime[i*prime[j]]=1;
                if(i%prime[j]==0) break;
            }
        }
    }
    #undef int
    int main()
    {
    #define int unsigned int
        oula();
        sum[0]=1;
        rep(i,1,tot)
            sum[i]=sum[i-1]*prime[i];
        int t,n;
        scanf("%u",&t);
        for(int mun=1;mun<=t;mun++)
        {
            scanf("%u",&n);
            ans=1;
            int cnt=1;
            while(1)
            {
                int m=(int)pow(n+0.9,1.0/cnt);
                if(m<2) break;
                int i=lower_bound(prime+1,prime+1+tot,m)-prime;
                if(prime[i]!=m)i--;
                ans*=sum[i];
                cnt++;
            }
            printf("Case %u: %u
    ",mun,ans);
        }
        return 0;
    }
  • 相关阅读:
    回溯、递归、DFS方法
    3-11日学习记录
    文本清洗总结
    归并排序学习
    3-9日学习笔记
    P3182 [HAOI2016]放棋子 错排问题
    P2880 [USACO07JAN]平衡的阵容Balanced Lineup 线段树 树状数组
    P3469 [POI2008]BLO-Blockade 强连通
    P2756 飞行员配对方案问题 网络流 二分图匹配
    P1823 [COI2007] Patrik 音乐会的等待 单调栈
  • 原文地址:https://www.cnblogs.com/minun/p/11347172.html
Copyright © 2011-2022 走看看