洛谷P1463 反素數 DFS DP

2022-09-03 05:15:07 字數 1994 閱讀 1971

輸出11到nn

中約數個數最多且盡量小的數。

如果你很厲害的話可以打出來乙個表。

#include

#include

using

namespace std;

long

long a=

;int n,ans,i;

intmain()

正解是dpd

p,如果你鑽研資料範圍的話dfs

dfs也可以過。

什麼是鑽研資料範圍呢?

首先,約數個數盡量多,那麼我們就把這個數拆成pri

me[1

]c[1

]×pr

ime[

2]c[

2]×p

rime

[3]c

[3].

....

.×pr

ime[

k]c[

k]pr

ime[

1]c[

1]×p

rime

[2]c

[2]×

prim

e[3]

c[3]

....

..×p

rime

[k]c

[k]。那麼由於n≤2

×109

n≤2×

109所以即使所有的c[k

]=1c

[k]=

1,那麼最大的pri

me[i

]pri

me[i

]也只要到2929

,因為2×3

×5×7

×11×13

×17×19

×23×29

≥2×1

092×

3×5×

7×11

×13×

17×1

9×23

×29≥

2×10

9,所以只要2929

就足夠了,換句話說,k≤10

k≤10

就行了。

那麼來證一下c[i

]c[i

]。由於pri

me[1

]32pr

ime[

1]32

(即23123

1)≥2×

109≥

2×10

9,所以c[i

]c[i

]肯定不會超過3030

。那麼易證c[1

]≥c[

2]≥c

[3].

....

.≥c[

k]c[

1]≥c

[2]≥

c[3]

....

..≥c

[k]才有最優解(具體證法可以參考《演算法競賽高階指南》),那麼dfs

dfs的範圍就縮小了很多,直接爆搜即可。

#include

#include

#define ll long long

using

namespace std;

const ll num=

;ll ans,a[14]

[41],maxn;

int n;

void

dfs(

int x,ll sum,

int k,ll s)

if(x>10)

return

;for

(int i=

0;i<=k;i++)if

(a[x]

[i]<=n)

dfs(x+

1,sum*a[x]

[i],i,s*

(i+1))

;else

break;}

intmain()

}dfs(1

,1,30

,1);

cout

}

洛谷P1463 反素數 DFS DP

輸出11到nn 中約數個數最多且盡量小的數。如果你很厲害的話可以打出來乙個表。include include using namespace std long long a int n,ans,i intmain 正解是dpd p,如果你鑽研資料範圍的話dfs dfs也可以過。什麼是鑽研資料範圍呢?...

洛谷P1463 反素數

對於任何正整數x,其約數的個數記作g x 例如g 1 1 g 6 4。如果某個正整數x滿足 g x g i 0現在給定乙個數n,你能求出不超過n的最大的反質數麼?乙個數n 1 n 2,000,000,000 不超過n的最大的反質數。輸入 1 1000輸出 1 840思路 菜雞第一次學習反素數,碼點字...

洛谷P1463 反素數

題目大意 給定 n 2e9 求不超過 n 的最大反素數。題解 引理1 不超過 2e9 的數的質因子分解中,最多有 10 個不同的質因子,且各個質因子的指數和不超過30。引理2 題目要求的最大反素數,實際上是求不超過 n 的數中因子數最多的數的集合中最小的那個數。引理3 通過引理 2 以及交換證明法可...