輸出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 以及交換證明法可...