【小米oj】 不一样的排序

线性筛+sort

 1 #define mm(a) memset(a,0,sizeof(a));
 2 #define max(x,y) (x)>(y)?(x):(y)
 3 #define min(x,y) (x)<(y)?(x):(y)
 4 #define Fopen freopen("1.in","r",stdin); freopen("m.out","w",stdout);
 5 #define rep(i,a,b) for(int i=(a);i<=(b);i++)
 6 #define per(i,b,a) for(int i=(b);i>=(a);i--)
 7 #include<bits/stdc++.h>
 8 typedef long long ll;
 9 #define PII pair<ll,ll>
10 using namespace std;
11 const int INF=0x3f3f3f3f;
12 const int MAXN=(int)2e6 + 5;
13 
14 struct node
15 {
16     int x;
17     int id;
18     int val;
19 }a[MAXN];
20 bool vis[MAXN];
21 int prime[MAXN];
22 
23 int t[MAXN],e[MAXN],n,k;
24 //geshu  fuzhu
25 void Init() {
26     int cnt=0;
27     t[1]=1;
28     for(int i=2; i<=MAXN; ++i) {
29         if(!vis[i]) {
30             prime[++cnt]=i;
31             t[i]=2;
32             e[i]=1;
33         }
34         for(int j=1; j<=cnt; ++j) {
35             if(i*prime[j]>MAXN) break;
36             vis[i*prime[j]]=true;
37             if(i%prime[j]==0) {
38                 t[i*prime[j]]=t[i]/(e[i]+1)*(e[i]+2);
39                 e[i*prime[j]]=e[i]+1;
40                 break;
41             } else {
42                 t[i*prime[j]]=t[i]*2;
43                 e[i*prime[j]]=1;
44             }
45         }
46     }
47 }
48 
49 
50 int main() {
51     Init();
52     while(~scanf("%d%d",&k,&n)) {
53         for(int i=1;i<=n;i++)scanf("%d",&a[i].x),a[i].id=i,a[i].val=t[a[i].x];
54         sort(a+1,a+1+n,[](node a,node b){
55             if(a.val!=b.val)return a.val<b.val;
56             return a.x<b.x;
57         });
58         printf("%d
",a[k].x);
59     }
60     return 0;
61 }
原文地址:https://www.cnblogs.com/dogenya/p/10815585.html