bzoj4524 CQOI2016 偽光滑數

2022-03-25 13:28:31 字數 1116 閱讀 9057

time limit:10 secmemory limit:512 mb若乙個大於r的整數j的質因數分解有f項,其最大的質因子為ak,並且滿足ak^k≤n,

ak<128,我們就稱整數j為n-偽光滑數。

現在給出l,求所有整數中,第e大的n-偽光滑數。

只有一行,為用空格隔開的整數l和e。

2 ≤ n ≤ 10^18, 1 ≤ k ≤ 800000,保證至少有 e 個滿足要求的數

只有一行,為乙個整數,表示答案。

12345 209167

優先佇列亂搞

天哪…cqoi2016的亂搞題好多orz

定義乙個四維狀態(t,x,y,z)表示當前的數為t,最大的質因數是x,x的次數是y,還可以加入的質因數最大是第z個質數。

有乙個很顯然的性質,如果最大的質數和質因數確定了,一定是盡可能多的選擇最大的質數。所以初始狀態是(x^y,x,y,z),滿足x^y≤n,z等於小於x的質數的個數。

然後每次從優先佇列中拿出最大的乙個數,加入對應的狀態是(t,x,y,z),如果y>1則從1-z中取出乙個質數替換掉乙個x,再加入優先佇列中。

這樣的操作保證了一定可以找到最大的k個數。

(表達能力好水...還是看**吧)

#include

#include

#include

#include

#include

#include

#include

#define f(i,j,n) for(int i=j;i<=n;i++)

#define d(i,j,n) for(int i=j;i>=n;i--)

#define ll long long

using namespace std;

int k,cnt,p[150];

ll n;

bool vst[150];

struct data;

bool operator q;

int main()

); f(j,2,128/i) vst[i*j]=true;

} f(i,1,k)

if (tmp.y) f(j,1,tmp.z) q.push((data));

} return 0;

}

bzoj 4524 Cqoi2016 偽光滑數

看到求第k大,k很小,首先應該想到k路歸併。利用可持久化可並堆進行dp g i j 表示前i個素數,用了j個質因子可以表示的數的集合 g i j sigma g i 1 j k p i k sigma表示集合的並,乘法用打標記實現。然後k路歸併,按照使用了的質因子個數分類。令mx j 表示取j個質因...

BZOJ 4524 Cqoi2016 偽光滑數

和d1的k遠點對類似的k優解求法 首先找到乙個集合使得當前最優解一定在其中 然後每次找到最優解並把與它有關且 必定 劣於它的加到集合裡去 重複k 1次 對於這道題顯然一開始的集合就是pi j,pi為質數且pi 128,pi j n 然後每次擴充套件就是把乙個數中的其中乙個質因數變小一點 當然還要ha...

bzoj 4524 Cqoi2016 偽光滑數

若乙個大於1的整數m的質因數分解有k項,其最大的質因子為ak,並且滿足ak k n,ak 128,我們就稱整數m為n 偽光滑數。現在給出n,求所有整數中,第k大的n 偽光滑數。這種問題首先發現乙個數是否是偽光滑數隻跟它的最大的質因子和分解後的項數有關,而只有31種質因子,所以總共的類別是有限的 把最...