若乙個大於 11 的整數m分解質因數後到的有重複的質因數序列有k 項,其最大的質因子為 \(a_k\),並且滿足 \(^k \leq n,k<128\),我們就稱整數 m 為 n-偽光滑數。
現在給出 n*n,求所有整數中,第 k大的 n-偽光滑數。
先篩出128以內的所有質數
根據題意貪心考慮,顯然m的質因數分解中最大的質數越大越好
於是我們把每個質數p的1次方,2次方,3次方...k次方(\(p^k \leq n\))加入堆(堆頂元素最大).
然後取k-1次,每次對於取出來的數x,除掉它的最大質因子,乘上乙個次大的質因子,這樣就構造出了乙個更小的數,且它顯然是 n-偽光滑數
取完k-1次後的堆頂就是最大的質數了
用優先佇列模擬這個過程,由於優先佇列中的元素可能會重複,會影響結果(重複的數被取出多次,導致取出來的不是第k大的),我們只要一次取出所有的最大元素即可
#include#include#include#include#include#define maxn 1005
using namespace std;
long long n;
int k;
int cnt=0;
int vis[maxn];
int prime[maxn];
void sieve(int n)
for(int j=1;j<=cnt&&i*prime[j]<=n;j++) }}
priority_queueq;
int main()
} for(int i=1;i<=k-1;i++)
} }printf("%lld\n",q.top());
}
hrbust2223 水題 貪心 二叉堆
題目 題意 n 個人排隊在 m個出水口前接水,第 i個人接水需時為 t i 請問接水的最短用時是多少?分析 貪心 二叉堆。將所有人從大到小排序,依次插入m個出水口,每次要插入到用時最小的出水口,最後輸出m個出水口中用時最多的那乙個。本 用優先佇列實現 include include include ...
(二叉)堆操作
堆操作 實驗目的 一 建堆 將陣列a 1.n 變成乙個最大堆。二 堆排序 將乙個堆中的元素按遞減排序輸出。三 用插入方法建堆 堆大小從1到n每次插入乙個元素到堆中,直到n個元素入堆。實驗原理 二叉 堆是乙個陣列,它可以被看成乙個近似的完全二叉樹。樹上的每乙個結點對應陣列中的乙個元素。除了最底層外,該...
簡單 二叉堆
堆是一種比較有用的資料結構,是二叉樹的一種陣列的表示形式。最大堆和最小堆是二叉堆的兩種形式。最大堆 根結點的鍵值是所有堆結點鍵值中最大者。最小堆 根結點的鍵值是所有堆結點鍵值中最小者。而最大 最小堆集結了最大堆和最小堆的優點,這也是其名字的由來。最大 最小堆是最大層和最小層交替出現的二叉樹,即最大層...