【数论】【算术基本定理】[LightOJ1289]LCM

题目

分析:设L(n)为LCM(1,2,3……n),则有

若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。

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

在实现过程中,如果暴力检查一个数是不是素数的幂,显然十分慢,所以计算所有素数的前缀和,对于前缀和的用法,看注释

#include<cstdio>
#include<algorithm>
#include<cmath>
using namespace std;
#define MAXP 6000000
#define MAXN 100000000
#define SHIFT 5
int p[MAXP+10],pcnt,n,T;
unsigned int sum[MAXP+10];
int f[(MAXN+10)>>SHIFT];
void SetBit(int x){
    f[x>>SHIFT]|=1<<(x&((1<<SHIFT)-1));
}
bool GetBit(int x){
    return f[x>>SHIFT]&(1<<(x&((1<<SHIFT)-1)));
}
void isprime(){
    int i,j,t=sqrt(MAXN+0.5);
    for(i=2;i<=t;i++){
        if(!GetBit(i)){
            p[++pcnt]=i;
            for(j=i*i;j<=MAXN;j+=i)
                SetBit(j);
        }
    }
    for(;i<=MAXN;i++)
        if(!GetBit(i))
            p[++pcnt]=i;
}
void prepare(){
    sum[0]=1;
    for(int i=1;i<=pcnt;i++)
        sum[i]=sum[i-1]*p[i];
}
int main()
{
    isprime();
    prepare();
    scanf("%d",&T);
    int Case=0;
    while(T--){
        scanf("%d",&n);
        printf("Case %d: ",++Case);
        unsigned int ans=1;
        int cnt=1;
        while(1)
        {
            int m=(int)pow(n+0.9,1.0/cnt);     //求n的cnt次方根
            if(m<2)
                break;
            int i=lower_bound(p+1,p+pcnt+1,m)-p;       //对于前i个素数,它们的cnt次方<=n
            if(p[i]!=m)
                i--;
            ans*=sum[i];                        //相当于枚举了前i个数的cnt次方
            cnt++;
        }
    printf("%u\n",ans);
    }
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-11-05 19:44:02

【数论】【算术基本定理】[LightOJ1289]LCM的相关文章

数论-算术基本定理

算术基本定理又叫唯一因子分解定理,算术基本定理的表述如下: 任何一个大于1的自然数 N,如果N不为质数,那么N可以唯一分解成有限个质数的乘积 ,这里P1<P2<P3......<Pn均为质数,其中指数ai是正整数.这样的分解称为 N 的标准分解式. 在进行证明这个定理之前,先说一个关于素数整除性的一个基本而重要的事实. 欧几里得引理:对所有的素数p和所有整数a,b,如果p|ab,则p|a,或p|b.即:如果一个素数整除两个正整数的乘积,那么这个素数可以至少整除这两个正整数中的一个.如果

NEFU118 n!后面有多少个0【算术基本定理】

题目链接: http://acm.nefu.edu.cn/JudgeOnline/problemshow.php?problem_id=118 题目大意: 问:计算N!末尾0的个数.(1 <= N <= 1000000000). 思路: N是100000000规模的数,直接计算结果,再统计0的个数显然不科学.将末尾0分解为2*5. 每一个0必然和一个因子5对应,但是一个数的因式分解中一个因子5不一定对应一个0.因为 还需要一个因子2,才能实现一一对应. 对于N!,在因式分解中,因子2的个数明显

light_oj 1347 算术基本定理

light_oj 1347 算术基本定理 C - Aladdin and the Flying Carpet Time Limit:3000MS     Memory Limit:32768KB     64bit IO Format:%lld & %llu Submit Status Practice LightOJ 1341 Description It's said that Aladdin had to solve seven mysteries before getting the M

poj 1845 Sumdiv (算术基本定理求一个数因子和)

求一个数的所有因子和可以用算术基本定理,下面是它的两个重要应用: (1)一个大于1的正整数N,如果它的标准分解式为: N=(P1^a1)*(P2^a2)......(Pn^an) 那么它的正因数个数为(1+a1)(1+a2).....(1+an). (2) 它的全体正因数之和为d(N)=(1+p1+...p1^an)(1+p2+...p2^a2)...(1+pn+...+pn^an) 和求一个数正因数个数的方法类似. 可以先打表出sqrt(n)以内的所有素数(当然也可以不打表),因为n的素因数中

hdu4479 (数学题)(算术基本定理)

题目大意 给定一个三元组\((x,y,z)\)的\(gcd\)和\(lcm\),求可能的三元组的数量是多少,其中三元组是的具有顺序的 其中\(gcd\)和\(lcm\)都是32位整数范围之内 由算术基本定理可以得知: 如果$k=gcd(m,n) \(则\) k_p=min(m_p,n_p)$ 如果\(k=lcm(m,n)\)则\(k_p=max(m_p,n_p)\) 那么我们可以把每个质因数分开讨论,因为三元组是有序的,所以我们考虑每两个数成为gcd和lcm的,另一个数在\((p_gcd,p_l

唯一分解定理(算术基本定理)及应用

算术基本定理:任何一个大于1的自然数 N,如果N不为质数,那么N可以唯一分解成有限个质数的乘积 N = p1^a1 * p2^a2 * p3^a3 * ... * pn^an (其中p1.p2.... pn为N的因子,a1.a2.... .an分别为因子的指数) 这样的分解称为 N 的标准分解式 应用: (1)一个大于1的正整数N,如果它的标准分解式为: N = p1^a1 * p2^a2 * p3^a3 * ... * pn^an (2)N的因子个数     M(N)= (1 + a1)*(1

NEFU119 组合素数【算术基本定理】

题目链接: http://acm.nefu.edu.cn/JudgeOnline/problemshow.php?problem_id=119 题目大意: 给你两个整数N和P,求出C(2*N,N)被素数p整数的次数. 思路: 由算术基本定理的性质(5)可得到N!被素数P整除的次数. 来看这道题,C(2*N,N) = (2*N)! / (N! * N!).最终结果就是从(2*N)!能被素数P整除的 次数里边减去N!能被素数整除的次数*2.最终结果为: [2*N/P] + [2*N/P^2] + -

算术基本定理

算术基本定理 算术基本定理,又称为正整数的唯一分解定理,即:每个大于1的自然数均可写为质数的积,而且这些素因子按大小排列之后,写法仅有一种方式.例如:,. 算术基本定理的内容由两部分构成: 分解的存在性: 分解的唯一性,即若不考虑排列的顺序,正整数分解为素数乘积的方式是唯一的. 算术基本定理是初等数论中一个基本的定理,也是许多其他定理的逻辑支撑点和出发点. 应用 (1)一个大于1的正整数N,如果它的标准分解式为: 那么它的正因数个数为 (2) 它的全体正因数之和为 当  时就称N为完全数. 是否

算术基本定理 求一个数的约数个数

算术基本定理  求一个数的约数个数 算术基本定理: 分解素因数:n=(p1^k1)*(p2^k2)*...*(pn*kn).(分解方式唯一) n的约数个数为cnt(n)=(1+k1)*(1+k2)*...*(1+kn). bool isprime[maxn]; vector<int> prime; void play_prime() { memset(isprime,1,sizeof(isprime)); isprime[1]=0; for(int i=2;i<maxn;i++){ if

51nod 1189 算术基本定理/组合数学

www.51nod.com/onlineJudge/questionCode.html#!problemId=1189 1189 阶乘分数 题目来源: Spoj 基准时间限制:1 秒 空间限制:131072 KB 分值: 80 难度:5级算法题 收藏 关注 1/N! = 1/X + 1/Y(0<x<=y),给出N,求满足条件的整数解的数量.例如:N = 2,1/2 = 1/3 + 1/6,1/2 = 1/4 + 1/4.由于数量可能很大,输出Mod 10^9 + 7. Input 输入一个数N