POJ3048 Max Factor

本文版权归ljh2000和博客园共有,欢迎转载,但须保留此声明,并给出原文链接,谢谢合作。

 

 

本文作者:ljh2000
作者博客:http://www.cnblogs.com/ljh2000-jump/
转载请注明出处,侵权必究,保留最终解释权!

 

 

 

Description

To improve the organization of his farm, Farmer John labels each of his N (1 <= N <= 5,000) cows with a distinct serial number in the range 1..20,000. Unfortunately, he is unaware that the cows interpret some serial numbers as better than others. In particular, a cow whose serial number has the highest prime factor enjoys the highest social standing among all the other cows. 

(Recall that a prime number is just a number that has no divisors except for 1 and itself. The number 7 is prime while the number 6, being divisible by 2 and 3, is not). 

Given a set of N (1 <= N <= 5,000) serial numbers in the range 1..20,000, determine the one that has the largest prime factor.

Input

* Line 1: A single integer, N 

* Lines 2..N+1: The serial numbers to be tested, one per line

Output

* Line 1: The integer with the largest prime factor. If there are more than one, output the one that appears earliest in the input file.

Sample Input

4
36
38
40
42

Sample Output

38

Hint

OUTPUT DETAILS: 
19 is a prime factor of 38. No other input number has a larger prime factor.

Source

 
 
正解:线性筛+暴力
解题报告:
  直接筛出质数,然后暴力就可以了。

  我连线性筛都写挂了一次,真是没救了...

 

 1 //It is made by ljh2000
 2 #include <iostream>
 3 #include <cstdlib>
 4 #include <cstring>
 5 #include <cstdio>
 6 #include <cmath>
 7 #include <algorithm>
 8 #include <ctime>
 9 #include <vector>
10 #include <queue>
11 #include <map>
12 #include <set>
13 #include <string>
14 #include <stack>
15 using namespace std;
16 typedef long long LL;
17 const int MAXN = 50011;
18 const int MAXM = 200011; 
19 int n,N,a[MAXN],maxl[MAXN];
20 int cnt,prime[MAXM],ans;
21 bool vis[MAXM];
22 
23 inline int getint(){
24     int w=0,q=0; char c=getchar(); while((c<'0'||c>'9') && c!='-') c=getchar();
25     if(c=='-') q=1,c=getchar(); while (c>='0'&&c<='9') w=w*10+c-'0',c=getchar(); return q?-w:w;
26 }
27 
28 inline void work(){
29     n=getint(); for(int i=1;i<=n;i++) a[i]=getint(),N=max(a[i],N); ans=1; int x;
30     for(int i=2;i<=N;i++) { if(!vis[i]) prime[++cnt]=i; for(int j=1;j<=cnt && i*prime[j]<=N;j++) { vis[i*prime[j]]=1; if(i%prime[j]==0) break;} }
31     for(int i=1;i<=n;i++) {
32     x=a[i];
33     for(int j=1;j<=cnt;j++) {
34         if(x%prime[j]!=0) continue;
35         maxl[i]=prime[j]; while(x%prime[j]==0) x/=prime[j];
36         if(x==1) break;
37     }
38     }
39     for(int i=2;i<=n;i++) if(maxl[i]>maxl[ans]) ans=i;
40     printf("%d",a[ans]);
41 } 
42 
43 int main()
44 {
45     work();
46     return 0;
47 }

 

转载于:https://www.cnblogs.com/ljh2000-jump/p/6067648.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值