可怜的小码哥
难度:黄金
时间限制:1秒
巴占用内存:128M
提瓦特大陆上有一个贫穷的占星术士小码哥,出于占星术的要求,他时常要解
决一些困难的数学问题。这天,他有遇到一个难题:对于一给定的素数集合
S=p1,p2,.·,pk,考虑一个正整数集合,该集合中任一元素的质因数全部属于
S。这个正整数集合包括,p1、p1×p2、p1×p1、p1×p2×P3·
(还有其
它)。该集合被称为S集合的“丑数集合”。小码哥现在的工作是对于给定的集
合S,去寻找“丑数集合”中的第n个“丑数”。
说明:丑数集合中每个数从小到大排列,每个丑数都是素数集合中的数的乘
积,第n个“丑数”就是在能由素数集合中的数相乘得来的(包括它本身)第
#include <bits/stdc++.h>
using namespace std;
int n,m;
//n个素数,寻找第m个丑数
int a[100],b[100];//a是素数集合,b记忆了对应质数在s里的遍历点
int s[100001];
//丑数集合
int main(){
scanf("%d %d",&n,&m);
for (int i=0;i<n;i++)
scanf("%d",&a[i]);
s[0]=1;
for(int i=1;i<=m;i++) {//每次找-个丑数
int temp = pow(2, 31) - 1;
for (int j = 0; j < n; j++) {//遍历n个质数,让循环次数更少
while (a[j] * s[b[j]] <= s[i - 1])
b[j] ++ ;
temp = min(a[j] * s[b[j]], temp);
}
s[i] = temp;
}
printf("%d",s [m]);
return 0;
}