题目:
题解:
这个题目挺有意思啊,楼主比较zz,先选择了STL的优先队列,然后就华丽丽的T掉了,据说手写堆可以卡过,可是我才不写那东西,看了题解,有一个比较睿智的方法。
队列记录的是从小到大的数字,我们再找个数组记录每一个质数“到达的/(记录过的)”队列位置,因为队列的下一位肯定是这几个质数乘上某个队列中的数字
代码:
#include <cstdio>
#include <iostream>
#define LL long long
using namespace std;
int a[105],x[105];LL q[1000005];
int main()
{
int k,n,i,num=0;
scanf("%d%d",&k,&n);
for (i=1;i<=k;i++) scanf("%d",&a[i]);
LL xz;
q[0]=1;
while (num<n)
{
xz=2147483647;
for (i=1;i<=k;i++)
xz=min(xz,q[x[i]]*a[i]);
q[++num]=xz;
for (i=1;i<=k;i++)
if (xz==q[x[i]]*a[i])
x[i]++;
}
printf("%lld",q[n]);
}