1 条题解
-
1
这段代码实现了生成“丑数”(仅包含质因数2、3、5、7的数)的算法,核心是通过优先队列思想高效生成有序丑数序列。
算法原理
丑数定义:丑数是只能被2、3、5、7整除的正整数,1是特殊的丑数。
生成策略:
维护4个指针p2,p3,p5,p7
,分别指向当前已生成丑数中乘以2、3、5、7后能得到最小新丑数的位置。
每次取4个候选值(a[p2]*2, a[p3]*3, a[p5]*5, a[p7]*7
)中的最小值作为下一个丑数,并将对应指针后移(避免重复生成)。
3. 数据结构:用数组a
存储生成的丑数,按顺序递增排列。关键步骤
初始化:数组首元素为1,4个指针均指向1。
迭代生成:循环计算4个候选值的最小值,加入数组并更新对应指针,直到超过最大值限制(1e18
)。
查询输出:根据输入直接返回数组中对应位置的丑数。#include <iostream> #include <cstdio> #include <algorithm> using namespace std; typedef long long LL; const LL maxn=1e18; LL allmin(LL a,LL b,LL c,LL d){ return min(min(a,b),min(c,d)); } LL a[70005],top=0; int main() { LL p2,p3,p5,p7,q=1; a[++top]=1; p2=p3=p5=p7=1; while(q<maxn&&q>0){ q=allmin(a[p2]*2,a[p3]*3,a[p5]*5,a[p7]*7); a[++top]=q; if(q==a[p2]*2) p2++; if(q==a[p3]*3) p3++; if(q==a[p5]*5) p5++; if(q==a[p7]*7) p7++; } LL ca,i; cin>>ca; while(ca--){ scanf("%lld",&i); printf("%lld\n",a[i]); } return 0; }
- 1
信息
- ID
- 2308
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 5
- 标签
- 递交数
- 1
- 已通过
- 1
- 上传者