MYF

HDU 2710 Max Factor

题目链接

HDU 2710

解题方法:筛法求素数

题目分析

题目大意

输入n个数字,每一个数字ai对应一个最大的质数约数bi,找bi最大的i对应的ai

解析

用筛法打表,将i的最大质数约数j储存在num[i]中,然后对于每一个输入的数字查询一下即可。

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
#include <set>
#include <map>
#include <stack>
#include <cmath>
#include <queue>
#include <cstdio>
#include <string>
#include <vector>
#include <iomanip>
#include <cstring>
#include <iostream>
#include <algorithm>
#define Memset(a,val) memset(a,val,sizeof(a))
#define PI acos(-1)
#define rt(n) (i == n ? '\n' : ' ')
#define hi printf("Hi----------\n")
#define debug(x) cout<<"Debug : ---"<<x<<"---"<<endl;
#define eps 1e-8
#define INF 0x3f3f3f3f
#pragma comment(linker, "/STACK:1024000000,1024000000")
typedef long long ll;
using namespace std;
#define maxn 10005
int prime[maxn]={1,2},num[maxn*2]={};
void make_form(){
int pcnt=0;
for (int i=2; i<=20000; i++) {
if (num[i]==0) {
prime[pcnt++]=i;
for (int j=i; j<=20000; j+=i) {
num[j]=i;
}
}
}
}
int main(){
make_form();
int n;
while(scanf("%d",&n)!=EOF){
int ans=1,x;
while (n--) {
scanf("%d",&x);
if (num[x]>num[ans]) {
ans=x;
}
}
printf("%d\n",ans);
}
}