丑数
给定一个包含 K个不同质数的集合 S={p1,p2,…,pK}。
如果一个数的质因子全部属于集合 S,那么我们就称这个数为谦虚数字。
例如,p1、p1p2、p1p1、p1p2p3…这些数字都是谦虚数字。
现在给定整数 K和集合 S,请你求出从小到大第 N个谦虚数字是多少。
注意,我们规定 1 不是谦虚数字。
输入格式
第一行包含两个整数 K和 N。
第二行包含 K 个质数。
输出格式
输出一个整数,表示第 N大的谦虚数字。
数据保证,答案在 int 范围内。
数据范围
1≤K≤100,1≤N≤10^5
AC代码:
#include<map>
#include<set>
#include<stack>
#include<cmath>
#include<queue>
#include<string>
#include<bitset>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<numeric>
#include<iomanip>
#define endl '\n'
//#define x first
//#define y second
using namespace std;
typedef long long ll;
typedef pair<int, int>PII;
const int N=3e5+10;
const int MOD=1e9 + 7;
const int INF=0X3F3F3F3F;
const int dx[]={-1,1,0,0,-1,-1,+1,+1};
const int dy[]={0,0,-1,1,-1,+1,-1,+1};
const int M = 1e6 + 10;
int k, n;
int a[N], b[N];
int f[N];
int main()
{
cin >> k >> n;
for(int i = 1; i <= k; i ++) cin >> a[i]; // 读入质数
f[0] = 1;
for(int i = 1; i <= n; i ++)
{
int minn = 2e9;
for(int j = 1; j <= k; j ++)
{
while(a[j] * f[b[j]] <= f[i - 1]) b[j] ++;//因为求的是个数因此应该为i - 1
minn = min(minn, a[j] * f[b[j]]);
}
f[i] = minn;
}//我想知道这种方法要怎么才能想到呢
cout << f[n] << endl;
return 0;
}