找最小的k个数(优先队列)

来源:互联网 发布:广州金博软件 编辑:程序博客网 时间:2024/06/05 03:23

kkun的一道简单签到题
发布时间: 2017年6月11日 17:59 最后更新: 2017年6月11日 18:10 时间限制: 2000ms 内存限制: 512M

描述
青大最优雅的程序员kkun一直友好(?)的致力于为学妹们出一道做法优雅而且非常简单的题。

例如著名的“一道非常简单的炉石题”,“一道非常简单的签到题”,“一道非常简单的数学题”,“一道非常简单的平衡树套替罪羊树套喜羊羊树套圣诞树套动态仙人掌”,“一道非常简单的签到题”(这个人是真的优雅,比那个菜凡不知道高到哪里去了!)

这次也不例外,他想从no cer那里拿到n个数,并找到其中最小的k个数。

但是no cer只是扔给了他一个公式:val[i]=k^(i+1)%1000000007(1<=i<=n),并让他自己一边玩去。

kkun顿时觉得这个问题变得索然无味,所以他让你来解决这个问题。

最终从大到小输出最小的k个数。

输入
第一行一个整数t代表数据组数
每组数据中
第一行两个整数n,k
n<=1e7
k<=1e4
k<=n

输出
从大到小输出k个数,每组数据占一行

样例输入1 复制
1
3 2
样例输出1
8 4

没看这题。= =一个优先队列

#include <bits/stdc++.h>using namespace std;const int N = 1e7+100;typedef long long ll;ll a[N];const int mod = 1e9+7;int main(){    int t;    scanf("%d",&t);    while(t--)    {        int n,m;        scanf("%d%d",&n,&m);        priority_queue<int> Q;        a[0]=m;        for(int i=1;i<=n;i++)        {                        a[i]=a[i-1]*m%mod;            if(i<=m)                Q.push(a[i]);        }        for(int i=m+1;i<=n;i++)        {            int top=Q.top();            if(a[i]<top)            {                Q.pop();                Q.push(a[i]);            }        }        printf("%d",Q.top() );        Q.pop();        for(int i=1;i<m;i++)        {            printf(" %d",Q.top() );            Q.pop();        }        printf("\n");    }}
原创粉丝点击