SRM632 Div2 1000 DP

【题意】:

给你一个值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

SRM632 Div2 1000 DP的相关文章

SRM627 Div2 1000 DP

[题意]:给出一个数列,可以进行的操作为最多能取K个互相不重叠的区间并将其反转,问经过操作以后,用冒号排序法排序数组所能达到的数的交 换次数的最小值.例如:一个数列{7,2,2,13,5,5,2}最多可以取2个互相不重叠的区间,那么有[0,2],[3,6],反转后的数组为{2,2,7,2,5,5,13},用冒号排 序法排序时所需要的交换次数为3.[知识点]:DP[题解1]:记忆化搜索DP(递归DP)虽然我知道记忆化搜索这东西本身,但因为智商拙计经常用不上去,我觉得自己真的对编码本身还有待提高,下

TOPCODER SRM 686 div2 1000

// TOPCODER SRM 686 div2 1000 Problem Statement 给出一个至多长 100 的字符串,仅包含 ( 和 ),问其中有多少个不重复的,合法的括号子序列. 子序列可以不连续:合法即括号序列的合法:答案模 1,000,000,007. Examples "(())(" Returns: 2 Correct non-empty bracket subsequences are "()" and "(())". &

Topcoder SRM 648 Div2 1000

Problem 给一个长度为N的字符串S,S只含有'A'.'B'.'C'三种元素.给定一个K,要求返回字符串S,使得S中恰好有K对pair(i,j)满足 0=<i<j<N,且 S[i]<S[j].若不存在,则返回空串. Limits Time Limit(ms): 2000 Memory Limit(MB): 256 N: [3, 30] K: [0, N*(N-1)/2 ] Solution 设S中含有n1个'A',n2个'B',n3个'C',设num=n1*n2+n1*n3+n

Topcoder Srm 673 Div2 1000 BearPermutations2

\(>Topcoder \space Srm \space 673 \space Div2 \space 1000 \space BearPermutations2<\) 题目大意 : 对于一个长度为 \(n\) 的排列,定义其的贡献为对其建笛卡尔树,树上有两个儿子的节点其左右儿子在原排列中的距离之和,给出 \(n, Mod\),求所有长度为 \(n\) 的排列的贡献之和对 \(Mod\) 取模的值 \(1 \leq n \leq 100\) 解题思路 : 考虑一个最暴力的 \(dp\) ,设

Topcoder SRM632 DIV2 解题报告

250:乱搞 解题代码: 1 // BEGIN CUT HERE 2 /* 3 4 */ 5 // END CUT HERE 6 #line 7 "RunningAroundPark.cpp" 7 #include <cstdlib> 8 #include <cctype> 9 #include <cstring> 10 #include <cstdio> 11 #include <cmath> 12 #include <

Topcoder SRM 654 Div2 1000

Problem 给一个长度为N(N∈[1,2000])的数列An(An∈[?100,100]),设ans=A1?A2?...?An,下面进行M(M∈[1,2000])次操作,每次将A的p[i]的值修改为v[i],即A[p[i]]=v[i],每次只允许加入最多2个括号进入ans等式,问ans的最大值可以是多少? Solution dp.. 设dp[i][j]表示从 1 到 i-1 已经有 j 个括弧时候的最大值,j=0时表示没有括弧,j=1时表示(这样子,j=2时表示(( 这个样子,j=3时表示(

SRM 628 DIV2 1000 CandleTimerEasy 状态压缩+DFS

题意:给你一个树型蜡烛,你可以从1个或多个叶子开始点蜡烛,问你能使蜡烛烧完以后能得到时间的个数. 解题思路:状态压缩枚举DFS, 解题代码: 1 // BEGIN CUT HERE 2 /* 3 4 */ 5 // END CUT HERE 6 #line 7 "CandleTimerEasy.cpp" 7 #include <cstdlib> 8 #include <cctype> 9 #include <cstring> 10 #include

[Topcoder]SRM632 div2 题解

TC第一次解出三题--当了次room leader-- 感觉这次的题比较弱,代码量也很小,都是在拼手速了 250 RunningAroundPark 题意很好懂,一圈跑道上有N棵树,现给你遇到这些树的顺序,问最少需要多少走圈才能遇到相应的序列 直接判断a[i]<=a[i+1]即可 首先假定走了一圈 #include <cstdlib> #include <cctype> #include <cstring> #include <cstdio> #inc

SRM631 Div2 1000 ???

保存代码,题解待更新... 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 TaroCoins{ 10 public: 11 long long getNumber(long long N){ 12 LL pushOne = 0, notP