51nod 猴猴吃香蕉 揹包

2021-09-29 06:45:44 字數 1457 閱讀 8664

猴猴最愛吃香蕉了。每天猴猴出門都會摘很多很多的香蕉,每個香蕉都有乙個甜度,猴猴不一定要把所有的香蕉都吃掉,猴猴每天都有乙個心情值k,猴猴希望當天吃的香蕉滿足這麼乙個條件,這些香蕉的甜度乘積恰好等於k,但是猴猴並不知道有多少種方法,於是猴猴把這個問題交給你。

m ≤1

08

m\leq 10^8

m≤10

8,根據試除法的推論,m

mm的約束不會超過2m=

2×10

42\sqrt=2\times 10^4

2m​=2×

104個。

所以我們求出m

mm的所有因數並排序,然後設f[i

]f[i]

f[i]

表示第組成第i

ii個因數的方案數,那麼我們對於讀入的x

xx,列舉m

mm的所有因數v

vv,如果x

xx是v

vv的因數,那麼就有

f [p

os[v

]]=f

[pos

[v]]

+f[p

os[v

x]

]f[pos[v]]=f[pos[v]]+f[pos[\frac]]

f[pos[

v]]=

f[po

s[v]

]+f[

pos[

xv​]

]其中pos

[x

]pos[x]

pos[x]

表示x

xx是m

mm的第幾個因數。

最終答案是f[k

]f[k]

f[k]

注意m

mm的因數要從大到小排序,因為01揹包是會覆蓋原來順序的。

#include

#include

#include

#include

using

namespace std;

const

int n=

20010

,mod=

1000000007

;int t,n,m,x,k,f[n]

,v[n]

;map<

int,

int> pos;

intmain()

sort

(v+1

,v+1

+k);

for(

int i=

1;i<=k;i++

) pos[v[i]

]=i;

f[1]

=1;for

(int i=

1;i<=n;i++

)printf

("%d\n"

,f[pos[m]])

;}return0;

}

11 02 猴猴吃香蕉

猴猴最愛吃香蕉了。每天猴猴出門都會摘很多很多的香蕉,每個香蕉都有乙個甜度,猴猴不一定要把所有的香蕉都吃掉,猴猴每天都有乙個心情值k,猴猴希望當天吃的香蕉滿足這麼乙個條件,這些香蕉的甜度乘積恰好等於k,但是猴猴並不知道有多少種方法,於是猴猴把這個問題交給你。揹包,依題目可得 只有k kk的約數才能作為...

猴猴吃香蕉(dp)

題目描述 猴猴最愛吃香蕉了。每天猴猴出門都會摘很多很多的香蕉,每個香蕉都有乙個甜度,猴猴不一定要把所有的香蕉都吃掉,猴猴每天都有乙個心情值k,猴猴希望當天吃的香蕉滿足這麼乙個條件,這些香蕉的甜度乘積恰好等於k,但是猴猴並不知道有多少種方法,於是猴猴把這個問題交給你。輸入 第一行乙個數d,表示有d天。...

問題 B 猴猴吃香蕉

題目描述 猴猴最愛吃香蕉了。每天猴猴出門都會摘很多很多的香蕉,每個香蕉都有乙個甜度,猴猴不一定要把所有的香蕉都吃掉,猴猴每天都有乙個心情值k,猴猴希望當天吃的香蕉滿足這麼乙個條件,這些香蕉的甜度乘積恰好等於k,但是猴猴並不知道有多少種方法,於是猴猴把這個問題交給你。輸入第一行乙個數d,表示有d天。接...