P2-2017级算法第二次上机 C 第k顺序统计量
题目描述
给定3个整数A, B, C, 和数组第一个数a[1]。数组a由如下方式得到。询问a中第k小的数是多少。
for(int i = 2; i <= 3000000; ++i)
a[i] = ((1LL * a[i - 1] * A ^ B) + C) % 1000000007;
输入
多组组数据,每组数据一行,数据组数不超过7
每行5个整数A, B, C, a[1], k (保证五个数为int范围内正整数且k在3000000范围内)
输出
对于每组数据,输出一行,第k小的数。
输入样例
4 5 6 7 8
输出样例
972
思路
第k顺序统计量查找,推荐使用STL的nth_element通过,选择分治的思想也可以,但是直接进行排序是一定无法通过的。时间复杂度O(n)。
关于nth_element:
头文件:<algorithm>
作用:nth_element作用为求第n大的元素,并把它放在第n位置上,下标是从0开始计数的,也就是说求第0小的元素就是最小的数。
还不是特别清楚,亟待解决。
参考代码
1 #include<cstdio> 2 #include<algorithm> 3 const int MAXN = 3000002; 4 int a[MAXN],A,B,C,k; 5 using namespace std; 6 int main() 7 { 8 while(scanf("%d%d%d%d%d",&A,&B,&C,&a[1],&k) == 5){ 9 for(int i = 2;i <= 3000000;i++) 10 a[i] = ((1LL * a[i-1] * A ^ B)+C)%1000000007; 11 nth_element(a+1,a+k,a+3000001); 12 printf("%d\n",a[k]); 13 } 14 }