51nod 1434 区间LCM (质因数分解)

分析:考虑从1到n所有数的质因数分解,记录每个质数的最高次数,同理从n+1循环到2n,如果循环到m时每个质因子的次数都不低于所记录的,则跳出循环,结果即为m。先预处理质数,复杂度为O(nlongn)。

 1 #include<iostream>
 2 #include<cstring>
 3 #include<cstdio>
 4 #include<algorithm>
 5 using namespace std;
 6 const int maxn=1000005;
 7 int prinum[maxn],len=0,n,m,power[maxn],order[maxn];
 8 int num[maxn];
 9 void CalPri(){
10     memset(order,-1,sizeof(order));
11     for(int i=0;i<maxn;i++)num[i]=i;
12     for(int i=2;i<maxn;i++){
13         if(num[i]==0)continue;
14         prinum[len++]=i;
15         order[i]=len-1;
16         for(int j=2*i;j<maxn;j+=i){
17             num[j]=0;
18         }
19     }
20 }
21 int solve(){
22     int countp=0;
23     if(order[n]!=-1)return 2*n;
24     memset(power,0,sizeof(power));
25     for(int k=0;k<len&&prinum[k]<=n;k++){
26         long long p=prinum[k],p0=prinum[k];
27         countp++;
28         while(p<=n){
29             p*=p0;
30             power[k]++;
31         }
32 //        int k0=k;
33 //        for(int i=0;i<len&&prinum[i]*prinum[i]<=k0;i++){
34 //            if(k0%prinum[i])continue;
35 //            int p=prinum[i],cnt=0;
36 //            if(power[i]==0)countp++;
37 //            while(k0%p==0){
38 //                k0/=p;cnt++;
39 //            }
40 //            power[i]=max(cnt,power[i]);
41 //        }
42 //        if(k0!=1){
43 //            if(power[order[k0]]==0)countp++;
44 //            power[order[k0]]=max(1,power[order[k0]]);
45 //        }
46     }
47     for(int k=n+1;k<=2*n;k++){
48         int k0=k;
49         for(int i=0;i<len&&prinum[i]*prinum[i]<=k0;i++){
50             if(k0%prinum[i])continue;
51             int p=prinum[i],cnt=0;
52             while(k0%p==0){
53                 k0/=p;cnt++;
54             }
55             if(power[i]>0&&power[i]<=cnt){
56                 countp--;
57                 power[i]=0;
58             }
59         }
60         if(k0!=1&&power[order[k0]]==1){
61             countp--;power[order[k0]]=0;
62         }
63         if(!countp){
64             return k;
65         }
66     }
67 }
68 int main(){
69     //freopen("e:\\in.txt","w",stdout);
70     CalPri();
71     int t;
72     cin>>t;
73     while(t--){
74         cin>>n;
75         cout<<solve()<<endl;
76     }
77     return 0;
78 }
时间: 2024-11-09 06:26:47

51nod 1434 区间LCM (质因数分解)的相关文章

51NOD 1434 区间LCM(素数筛)

传送门 1434 区间LCM 题目来源: TopCoder 基准时间限制:1 秒 空间限制:131072 KB 分值: 40 难度:4级算法题 收藏 关注 一个整数序列S的LCM(最小公倍数)是指最小的正整数X使得它是序列S中所有元素的倍数,那么LCM(S)=X. 例如,LCM(2)=2,LCM(4,6)=12,LCM(1,2,3,4,5)=60. 现在给定一个整数N(1<=N<=1000000),需要找到一个整数M,满足M>N,同时LCM(1,2,3,4,-,N-1,N) 整除 LCM

51nod 1434 区间LCM 素数

1434 区间LCM 题目来源: TopCoder 基准时间限制:1 秒 空间限制:131072 KB 分值: 40 难度:4级算法题 一个整数序列S的LCM(最小公倍数)是指最小的正整数X使得它是序列S中所有元素的倍数,那么LCM(S)=X. 例如,LCM(2)=2,LCM(4,6)=12,LCM(1,2,3,4,5)=60. 现 在给定一个整数N(1<=N<=1000000),需要找到一个整数M,满足M>N,同时LCM(1,2,3,4,...,N- 1,N) 整除 LCM(N+1,N

51nod 1240 莫比乌斯函数 (质因数分解)

1240 莫比乌斯函数 基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础题 收藏 关注 取消关注 莫比乌斯函数,由德国数学家和天文学家莫比乌斯提出.梅滕斯(Mertens)首先使用μ(n)(miu(n))作为莫比乌斯函数的记号.(据说,高斯(Gauss)比莫比乌斯早三十年就曾考虑过这个函数). 具体定义如下: 如果一个数包含平方因子,那么miu(n) = 0.例如:miu(4), miu(12), miu(18) = 0. 如果一个数不包含平方因子,并且有k个不同的质因

POJ 1845 Sumdiv#质因数分解+二分

题目链接:http://poj.org/problem?id=1845 关于质因数分解,模板见:http://www.cnblogs.com/atmacmer/p/5285810.html 二分法思想:选定一个要进行比较的目标,在区间[l,r]之间不断二分,直到取到与目标相等的值. #include<iostream> #include<cstdio> #include<cstring> using namespace std; typedef long long ll

POJ 2429 long long 质因数分解

GCD & LCM Inverse Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 16206   Accepted: 3008 Description Given two positive integers a and b, we can easily calculate the greatest common divisor (GCD) and the least common multiple (LCM) of a

质因数分解的rho以及miller-rabin

一.前言 质因数分解,是一个在算法竞赛里老生常谈的经典问题.我们在解决许多问题的时候需要用到质因数分解来辅助运算,而且质因数分解牵扯到许许多多经典高效的算法,例如miller-rabin判断素数算法,rho启发式搜索质因数分解算法等.在此文里,我要介绍的就是miller-rabin算法以及rho启发式搜索分解算法. 二.算术基本定理 首先,我们得知道,任意一个大于1的自然数都可以分解为有限个质数的乘积.这里因子均为质数,且为正整数.我们把这样的分解成为N的标准分解式.关于算数基本定理的应用有许多

【BZOJ2227】【ZJOI2011】看电影 [组合数学][质因数分解]

看电影 Time Limit: 10 Sec  Memory Limit: 259 MB[Submit][Status][Discuss] Description 到了难得的假期,小白班上组织大家去看电影.但由于假期里看电影的人太多,很难做到让全班看上同一场电影,最后大家在一个偏僻的小胡同里找到了一家电影院.但这家电影院分配座位的方式很特殊,具体方式如下: 1. 电影院的座位共有K个,并被标号为1…K,每个人买完票后会被随机指定一个座位,具体来说是从1…K中等可能的随机选取一个正整数,设其为L.

Codevs 1313 质因数分解

1313 质因数分解 题目描述 Description 已知正整数 n是两个不同的质数的乘积,试求出较大的那个质数 . 输入描述 Input Description 输入只有一行,包含一个正整数 n. 输出描述 Output Description 输出只有一行,包含一个正整数p,即较大的那个质数. 样例输入 Sample Input 21 样例输出 Sample Output 7 #include<iostream> #include<cstdio> #include<cm

HDU 3988 n!质因数分解

Harry Potter and the Hide Story Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Submission(s): 2324    Accepted Submission(s): 569 Problem Description iSea is tired of writing the story of Harry Potter, so, l