01背包tle。

解题报告(by System Message)
类似于背包的DP,以乘积为状态。先把等选数字里面不是K约数的去掉。然后找出K的约数,进行离散化。然后dp[i][j]表示前i个数字乘积为j的状态。Dp[i+1][j*a[i+1]]]+=dp[i][j].
Dp[i+1][j]+=dp[i][j];
总的复杂度是O(n*d(k)*log(d(k)))
D(k)表示k的因子数目。多一个log是因为离散化了,对应下标的时候要二分查找。

其实我觉得就是去掉没用的状态只用他的约数来更新。网上有的题解用map也是避免了没用的状态。

  1. #include<cstdio>
  2. #include<cstring>
  3. #include<cctype>
  4. #include<algorithm>
  5. #include<cmath>
  6. #include<map>
  7. using namespace std;
  8. #define rep(i,s,t) for(int i=s;i<=t;i++)
  9. #define dwn(i,s,t) for(int i=s;i>=t;i--)
  10. #define clr(x,c) memset(x,c,sizeof(x))
  11. int read(){
  12. int x=0;char c=getchar();
  13. while(!isdigit(c)) c=getchar();
  14. while(isdigit(c)) x=x*10+c-'0',c=getchar();
  15. return x;
  16. }
  17. const int nmax=1e4+5;
  18. const int mod=1e9+7;
  19. int a[nmax],ans[nmax];
  20. void mm(int &a) {
  21. if(a>=mod) a-=mod;
  22. }
  23. int main(){
  24. int T=read();
  25. while(T--){
  26. int n=read(),k=read(),cnt=0,u,v,d;
  27. for(v=1;v*v<k;v++) if(k%v==0) a[++cnt]=v,a[++cnt]=k/v;
  28. if(v*v==k) a[++cnt]=v;
  29. sort(a+1,a+cnt+1);
  30. rep(i,1,cnt) ans[i]=0;ans[1]=1;
  31. rep(i,1,n){
  32. u=read();if(k%u) continue;
  33. dwn(j,cnt,1) {
  34. v=lower_bound(a+1,a+cnt+1,a[j]*u)-a;
  35. if(a[v]==a[j]*u) mm(ans[v]+=ans[j]);
  36. }
  37. }
  38. printf("%d\n",ans[cnt]);
  39. }
  40. return 0;
  41. }

  

基准时间限制: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
  1. 多组测试数据。在输入文件的第一行有一个整数T(0< T <= 20),表示有T组数据。
  2. 接下来的2*T行,会给出每一组数据
  3. 每一组数据占两行,第一行包含两个整数n, K(1<=n<=1000,2<=K<=100000000)他们的含意已经在上面提到。
  4. 第二行包含a[0],a[1],a[2],...,a[n-1] (1<= a[i]<=K) 以一个空格分开。
  5. 所有输入均为整数。
Output
  1. 对于每一个数据,将答案对1000000007取余之后输出即可。
Input示例
  1. 2
  2. 3 3
  3. 1 1 3
  4. 3 6
  5. 2 3 6
Output示例
  1. 4
  2. 2

51nod1354 选数字的更多相关文章

  1. 【题解】选数字 [51nod1354]

    [题解]选数字 [51nod1354] 传送门:选数字 \([51nod1354]\) [题目描述] 共 \(T\) 组测试点,每一组给定一个长度为 \(n\) 的序列和一个整数 \(K\),找出有多 ...

  2. 51 Nod 1354 选数字(体现动态规划的本质)

    1354 选数字  基准时间限制:1 秒 空间限制:131072 KB 分值: 80 难度:5级算法题  收藏  关注 当给定一个序列a[0],a[1],a[2],...,a[n-1] 和一个整数K时 ...

  3. Qbxt 模拟题 day3(am) T3 选数字 (select)(贪心)

    选数字 (select Time Limit:3000ms Memory Limit:64MB 题目描述 LYK 找到了一个 n*m 的矩阵,这个矩阵上都填有一些数字,对于第 i 行第 j 列的位置上 ...

  4. 1354 选数字 DP背包 + 数学剪枝

    http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1354&judgeId=187448 其实这题和在若干个数字中,选 ...

  5. 51nod P1354 选数字 题解

    每日一题 day8 打卡 Analysis 背包+离散化 这题是我们一次模拟赛的T2,结果我的暴力全TLE了. 关键是如果将两个因数的乘积离散化在因数数组中之后等于这个乘积本身,说明a[j]*in离散 ...

  6. Cogs 763. [USACO Open09] 数字的游戏(博弈)

    [USACO Open09] 数字的游戏 ★☆ 输入文件:cdgame.in 输出文件:cdgame.out 简单对比 时间限制:1 s 内存限制:128 MB Bessie正跟FJ玩一个数字游戏,她 ...

  7. 【C语言程序设计】—最近超火的小游戏—【数字炸弹】!

    ✍  准备工作和建议 一.程序的原理 在动手编程之前,得先跟大家说一下这个程序是干什么的. 我们可以称呼这个游戏为<数字炸弹>. 游戏的原理是这样: 每一轮电脑从 1 到 100 中随机抽 ...

  8. Oracle中生成随机数的函数(转载)

    在Oracle中的DBMS_RANDOM程序包中封装了一些生成随机数和随机字符串的函数,其中常用的有以下两个: DBMS_RANDOM.VALUE函数 该函数用来产生一个随机数,有两种用法: 1. 产 ...

  9. Uva 10891 经典博弈区间DP

    经典博弈区间DP 题目链接:https://uva.onlinejudge.org/external/108/p10891.pdf 题意: 给定n个数字,A和B可以从这串数字的两端任意选数字,一次只能 ...

随机推荐

  1. Sqli-labs less 15

    Less-15 本关没有错误提示,那么我们只能靠猜测进行注入.这里我直接从源代码中看到了sql语句 @$sql="SELECT username, password FROM users W ...

  2. JAVA 异常对于性能的影响

    陶炳哲 - MAY 12, 2015 在对OneAPM的客户做技术支持时,我们常常会看到很多客户根本没意识到的异常.在消除了这些异常之后,代码运行速度与以前相比大幅提升.这让我们产生一种猜测,就是在代 ...

  3. Wildcard Matching

    Implement wildcard pattern matching with support for '?' and '*'. '?' Matches any single character. ...

  4. 最长连续回文串(最优线性时间O(n))

    转自:http://blog.csdn.net/hopeztm/article/details/7932245 Given a string S, find the longest palindrom ...

  5. 2014 ACM/ICPC Asia Regional Xi'an Online(HDU 5007 ~ HDU 5017)

    题目链接 A题:(字符串查找,水题) 题意 :输入字符串,如果字符串中包含“ Apple”, “iPhone”, “iPod”, “iPad” 就输出 “MAI MAI MAI!”,如果出现 “Son ...

  6. tomcat下context.xml中JNDI数据源配置

    jndi(Java Naming and Directory Interface,Java命名和目录接口)是一组在Java应用中访问命名和目录服务的API.命名服务将名称和对象联系起来,使得我们可以用 ...

  7. maven编译时候报"编码 GBK 的不可映射字符"

    决这个问题的思路: 在maven的编译插件中声明正确的字符集编码编码——编译使用的字符集编码与代码文件使用的字符集编码一致!! 安装系统之后,一般中文系统默认字符集是GBK.我们安装的软件一般都继承使 ...

  8. Linux问题定位工具大放送

    我们在程序定位问题时,经常不知所错,但是在linux有很多强大的工具,只要我们合理利用,一定见奇效. 主要会遇到以下问题: 1 mem高 2 cpu高 3 io高 4 网络延迟高 vargrind:h ...

  9. (.iso)光盘镜像文件的打开与安装

    直接解压就可以打开,然后就可以安装.exe文件

  10. 【Apache运维基础(5)】Apache的Rewrite攻略(2)

    简述 .htaccess文件(或者"分布式配置文件")提供了针对目录改变配置的方法, 即,在一个特定的文档目录中放置一个包含一个或多个指令的文件, 以作用于此目录及其所有子目录.作 ...