【题意】:
给你一个值v和一组数字,求在这组数字中有多少种可用的组合,可用的组合意思是组合中数字乘积等于这个v(不同位置的数组成的相同情况视为不同的解)。
【知识点】:DP
【题解】:
声明map<LL, LL> mp; 第一个元素代表能整除v的一个数,第二个元素代表数字组前i个元素中乘积为该数的集合数。
然后遍历这组数字,mp[v]的值即为答案。 当v为1时,要特判减1。
【代码】:
1 #include <cstdio> 2 #include <string> 3 #include <vector> 4 #include <map> 5 using namespace std; 6 7 #define LL long long 8 9 class GoodSubset{ 10 public: 11 map<int, int> mp; 12 int numberOfSubsets(int goodValue, vector <int> d){ 13 const LL MOD = 1000000007; 14 map<LL, LL> mp; 15 mp[1] = 1; 16 map<LL, LL>::reverse_iterator it; 17 for(int i = 0; i < d.size(); i++){ 18 LL val = d[i]; 19 for(it = mp.rbegin(); it != mp.rend(); it++){ 20 LL z = it->first; z *= val; 21 if(goodValue % z == 0){ 22 mp[z] = (mp[z] + it->second) % MOD; 23 } 24 } 25 } 26 mp[1]--; 27 return mp[goodValue]; 28 } 29 };
时间: 2024-12-17 13:00:52