若乙個大於1的整數m的質因數分解有k項,其最大的質因子為ak,並且滿足ak^k<=n,ak<128,我們就稱整數m為n-偽光滑數。現在給出n,求所有整數中,第k大的n-偽光滑數。這種問題首先發現乙個數是否是偽光滑數隻跟它的最大的質因子和分解後的項數有關,而只有31種質因子,所以總共的類別是有限的(把最大的質因子和分解後的項數都相同的歸為一類)。
那根據套路開個大根堆,一開始把所有類別的最大值放進去,每取top一次從大到小拓展同類別的數,當然要保證乙個數隻會被拓展一次。那麼結果就為第k次取top的結果。
#include
#include
#include
#include
#include
#include
using
namespace std;
inline
intread()
while
(ch>=
'0'&& ch<=
'9')x=x*
10+ch-
'0',ch=
getchar()
;return x*f;
}inline
void
write
(int x)
inline
void
pr1(
int x)
inline
void
pr2(
int x)
struct node};
priority_queueq;
bool
operator
<
(node a,node b)
int sta[35]
=;intmain()
}while
(num--
)else
if(uf.cnt[i]
)bk=
true;if
(bk==
true)}
}printf
("%lld\n"
,q.top()
.d);
return0;
}
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...
bzoj4524 CQOI2016 偽光滑數
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 1...