题目
Description
求数组的第k小,数字数量非常多。
Input
每组数据给出n m k
表示有n
个数,求第k
小,数组的数字由以下规则得到:
ai = mi mod (109+7), i = 1, 2, ..., n
其中 1 ≤ n, m ≤ 5 × 107, 1 ≤ k ≤ n,数据保证得到的数组元素大部分互不相等。
Output
输出第k小的数
代码
没必要用快排把整个数组都排成有序的 。
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
const int maxn = 50000000;
int a[maxn];
void swap(int& a, int& b)
{
int tmp;
tmp = a;
a = b;
b = tmp;
}
int ss(int *a,int low,int high,int k)
{
int i = low, j = high;
int pri = a[i];
while (i < j)
{
while (a[j] >= pri && i < j) {
j--;
}
if (i < j) {
a[i] = a[j];
i++;
}
while (a[i] <= pri && i < j) {
i++;
}
if (i < j) {
a[j] = a[i];
j--;
}
}
a[i] = pri;
if (i == (k - 1)) {
return pri;
}
else if (i < (k - 1)) {
return (ss(a, i + 1, high, k));
}
else {
return (ss(a, low, i - 1, k));
}
}
int main()
{
int n, m, k;
scanf("%d %d %d", &n, &m, &k);
int mod = 1e9 + 7;
a[0] = m;
for (int i = 1; i < n; i++)
a[i] = 1LL * a[i - 1] * m % mod;
ss(a, 0, n - 1, k);
printf("%d\n", a[k - 1]);
return 0;
}