您的位置:首页 > 其它

51nod 算法马拉松7 B.选数字

2015-11-02 18:28 246 查看
1354 选数字

基准时间限制:1 秒 空间限制:131072 KB 分值: 80 难度:5级算法题

当给定一个序列a[0],a[1],a[2],...,a[n-1] 和一个整数K时,我们想找出,有多少子序列满足这么一个条件:把当前子序列里面的所有元素乘起来恰好等于K。
样例解释:

对于第一个数据,我们可以选择[3]或者[1(第一个1), 3]或者[1(第二个1), 3]或者[1,1,3]。所以答案是4。

Input
多组测试数据。在输入文件的第一行有一个整数T(0< T <= 20),表示有T组数据。
接下来的2*T行,会给出每一组数据
每一组数据占两行,第一行包含两个整数n, K(1<=n<=1000,2<=K<=100000000)他们的含意已经在上面提到。
第二行包含a[0],a[1],a[2],...,a[n-1] (1<= a[i]<=K) 以一个空格分开。
所有输入均为整数。


Output
对于每一个数据,将答案对1000000007取余之后输出即可。


Input示例
2
3 3
1 1 3
3 6
2 3 6


Output示例
4
2


我的方法:

类似01背包问题,但是空间太大了。

所以这里用的是map<int,int>g,只保存一些有用的状态,即能整除k的数。

官方解题报告
类似于背包的DP,以乘积为状态。先把等选数字里面不是K约数的去掉。然后找出K的约数,进行离散化。
根据这个写的代码(参考代码

其实一早就看出是背包的DP了,但是map不熟悉,一些细节没有把握好,代码实现能力还有待提升。其实以前做个离散化的一个题,没有总结自己以前做过的题,没有联想以前做过的题,一做不出来容易浮躁。哎!!还是太年轻了!!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: