BZOJ 4524 Cqoi2016 偽光滑數

2022-04-02 22:25:27 字數 886 閱讀 2840

題意殺233,開始我習慣地認為質因數分解就是那種\(2^\times 3^\times \cdots \times p_k^\)的形式,然後\(p_k^\)算作一項,苦想了30min無果

然後看了下陳指導的部落格,nmd原來上面的指數要展開的!(好吧這樣本來也就是展開來的縮寫),然後就會做了

首先要求前\(k\)大,先考慮最大的情況。不難發現這個時候所有質因數都相同顯然是最優的,因為如果不相同那麼我們必然可以把不是最大的那些質因數全部換成最大的而滿足\(a_k^k\)不變

那麼就很容易了,我們搞出\(< 128\)的所有質數,然後把它們的冪次都扔到堆裡去,考慮如何更新答案

由於現在的質因數都是相同的且最大的,那麼我們肯定是在保證最大質因數項數不變的情況下讓這個數本身變小,那麼就是把其中的乙個最大質因數換成更小的即可

然後為了避免重複,我們還需要控制乙個範圍,表示列舉的替換的質因數的範圍,同時還要保證替換之後這個最大質因數的冪次至少是\(1\)(廢話)

然後我們開乙個四元組表示上面提到的狀態即可

#include#include#define ri register int

#define ci const int&

using namespace std;

typedef long long ll;

const int prime[31]=;

struct data

); for (i=1;i1) for (j=0;j<=now.lim;++j)

hp.push((data));

}return printf("%lld",hp.top().val),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種質因子,所以總共的類別是有限的 把最...