CQOI2016 偽光滑數

2022-07-13 19:24:15 字數 1593 閱讀 5231

題目描述

若乙個大於1的整數m的質因數分解有k項,其最大的質因子為ak,並且滿足ak^k<=n,ak

<128,我們就稱整數m為n-偽

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

題解

題面的k意思是將這個數質因數分解後所有的質因子的指數和。

我們先把128以內的所有素數找出來,然後做乙個dp

我們令dp[i][j]表示當前數的最大的質因子為p[i],當前所有素因子的指數和為j的數的集合。

我們再令g[i][j]表示當指數和位j時,所有最大質因子小於等於p[i]的數的集合。

然後我們可以合併集合。

f[i][j]=∑g[i-1][j-k]*p[i]k

g[i][j]=g[i-1][j]+f[i][j]

然後我們可以用函式式可並堆來維護所有的轉移,在開乙個全域性的堆來維護所有的f。

然後一直彈堆頂就可以了。

注意pushdown

**

#include#include

#include

#include

using

namespace

std;

typedef

long

long

ll;int tot,prime[33],k,f[33][65],g[33][65

];ll n;

bool vis[130

];inline ll rd()

while(isdigit(c))

return f?-x:x;

}struct

node

inline

bool

operator

<(const node &b)const

};priority_queue

q;struct

tree

}tr[

16000002

];inline

int newnode(int

x,ll y)

inline

void pushdown(int

cnt)

}int merge(int x,int

y)inline

void

prework()

}}int

main()

g[i][j]=merge(g[i-1

][j],f[i][j]);

q.push(node(i,j,tr[f[i][j]].val));}}

ll ans=0

;

while(k--)

printf(

"%lld

",ans);

return0;

}

CQOI 2016 偽光滑數

又是一道神仙題。蒟蒻表示不看題解根本不會做 首先我們定義乙個 dp 陣列 mathtt 表示 最大質因子為 mathtt 分解成 j 個質數 可以相同 組成的集合 其中 mathtt 是這個集合的根節點,在這裡我們用左偏樹 我們知道,只要得到了這個 dp,我們就可以把這個玩意兒的權值塞進佇列排序,再...

4524 Cqoi2016 偽光滑數

time limit 10 sec memory limit 512 mb submit 280 solved 133 submit status discuss 若乙個大於r的整數j的質因數分解有f項,其最大的質因子為ak,並且滿足ak k n,ak 128,我們就稱整數j為n 偽光滑數。現在給出...

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個質因...