4524 Cqoi2016 偽光滑數

2021-07-25 15:11:48 字數 2057 閱讀 7569

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-偽光滑數。

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

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

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

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

12345 20

9167 [

submit][

status][

discuss]

正解是可持久化可並堆 + dp,,看了題解才會= =

先篩出2~128內所有質數,分別給它們乙個編號

定義f[i][j]:質因數最大為pri[i],由j個質因數組成的數的集合

定義g[i][j]:質因數最大為pri[1] ~ pri[i],由j個質數組成的數的集合

定義u*g為集合u中所有數字乘以g,定義a + b為集合a,b取並集

那麼很好寫出f,g的方程,f[i][j] = ∑g[i-1][k]*pri[i]^(j-k),g[i][j] = g[i-1][j] + f[i][j]

詢問的話先把所有f[i][j]中最大的數都扔進堆裡,每次取出最大的數字,把它所在集合的次大數扔進堆

不斷重複k次就是答案了

f,g的集合可以用可持久化可並堆 + 懶惰標記解決

這樣就能保證存數集最大數的那個堆裡的元素大小線性,因為每次取出乙個數新放兩個數

#include#include#include#include#include#include#include#includeusing namespace std;

typedef long long ll;

typedef double db;

const int maxn = 8e5 + 80;

const int t = 15;

struct heaph[maxn*t];

struct node

node(int num,ll val): num(num),val(val){}

bool operator < (const node &b) const

};ll n,mi[100][100],pri[100];

int k,tot,cnt,f[100][100],g[100][100];

bool not_pri[200];

priority_queue ,less> q;

void pre_work()

} for (int i = 1; i <= tot; i++) }

}void pushdown(int x)

h[x].mark = 1;

}int merge(int x,int y)

int main()

for (int k = 0; k < j; k++) if (g[i-1][k])

g[i][j] = merge(g[i-1][j],f[i][j]);

if (!f[i][j]) continue;

pushdown(f[i][j]); q.push(node(f[i][j],h[f[i][j]].val));

} for (int i = 1; ; i++)

for (int i = 0; i < 2; i++)

if (h[now].ch[i])

}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種質因子,所以總共的類別是有限的 把最...