1. /************************************************
  2. * Author :Running_Time
  3. * Created Time :2015/10/28 星期三 20:20:09
  4. * File Name :H.cpp
  5. ************************************************/
  6.  
  7. #include <cstdio>
  8. #include <algorithm>
  9. #include <iostream>
  10. #include <sstream>
  11. #include <cstring>
  12. #include <cmath>
  13. #include <string>
  14. #include <vector>
  15. #include <queue>
  16. #include <deque>
  17. #include <stack>
  18. #include <list>
  19. #include <map>
  20. #include <set>
  21. #include <bitset>
  22. #include <cstdlib>
  23. #include <ctime>
  24. using namespace std;
  25.  
  26. #define lson l, mid, rt << 1
  27. #define rson mid + 1, r, rt << 1 | 1
  28. typedef long long ll;
  29. const int N = 1e3 + 10;
  30. const int M = 1e2 + 10;
  31. const int INF = 0x3f3f3f3f;
  32. const int MOD = 1e9 + 7;
  33. const double EPS = 1e-10;
  34. const double PI = acos (-1.0);
  35. int dp[2][N][N];
  36. int lcm[N][N];
  37. int vec[N];
  38.  
  39. int GCD(int a, int b) {
  40. return b ? GCD (b, a % b) : a;
  41. }
  42.  
  43. void init(void) {
  44. for (int i=1; i<=1000; ++i) {
  45. for (int j=1; j<=1000; ++j) {
  46. lcm[i][j] = i * j / GCD (i, j);
  47. }
  48. }
  49. }
  50.  
  51. inline void add(int &x, int y) {
  52. x += y;
  53. if (x > MOD) x -= MOD;
  54. }
  55.  
  56. int main(void) {
  57. init ();
  58. int n, m, k;
  59. while (scanf ("%d%d%d", &n, &m, &k) == 3) {
  60. int t = 0;
  61. for (int i=1; i<=m; ++i) {
  62. if (m % i == 0) vec[t++] = i;
  63. }
  64. int now = 0;
  65. for (int i=0; i<=n; ++i) {
  66. for (int j=0; j<t; ++j) {
  67. dp[now][i][vec[j]] = 0;
  68. }
  69. }
  70. dp[now][0][1] = 1;
  71. for (int l=1; l<=k; ++l) {
  72. now ^= 1;
  73. for (int i=0; i<=n; ++i) {
  74. for (int j=0; j<t; ++j) {
  75. dp[now][i][vec[j]] = 0;
  76. }
  77. }
  78. for (int i=l-1; i<=n; ++i) {
  79. for (int j=0; j<t; ++j) {
  80. if (dp[now^1][i][vec[j]] == 0) continue;
  81. for (int p=0; p<t; ++p) {
  82. int x = i + vec[p];
  83. int y = lcm[vec[j]][vec[p]];
  84. if (x > n || m % y != 0) continue;
  85. dp[now][x][y] = (dp[now][x][y] + dp[now^1][i][vec[j]]) % MOD;
  86. }
  87. }
  88. }
  89. }
  90. printf ("%d\n", dp[now][n][m]);
  91. }
  92.  
  93. //cout << "Time elapsed: " << 1.0 * clock() / CLOCKS_PER_SEC << " s.\n";
  94.  
  95. return 0;
  96. }

  

DP(优化) UVALive 6073 Math Magic的更多相关文章

  1. UVALive 6073 Math Magic

                                                  6073 Math MagicYesterday, my teacher taught us about m ...

  2. Math Magic(完全背包)

    Math Magic Time Limit:3000MS     Memory Limit:32768KB     64bit IO Format:%lld & %llu Submit Sta ...

  3. hdu3585 二分最大团(dp优化)

    题意       给你一些点( <= 50),让你找到k个点,使得他们之间的最小距离最大. 思路:       求最小的最大,我们可以直接二分去枚举距离,但是要注意,不要去二分double找距离 ...

  4. 树形DP CCPC网络赛 HDU5834 Magic boy Bi Luo with his excited tree

    // 树形DP CCPC网络赛 HDU5834 Magic boy Bi Luo with his excited tree // 题意:n个点的树,每个节点有权值为正,只能用一次,每条边有负权,可以 ...

  5. NOIP2015 子串 (DP+优化)

    子串 (substring.cpp/c/pas) [问题描述] 有两个仅包含小写英文字母的字符串 A 和 B.现在要从字符串 A 中取出 k 个 互不重 叠 的非空子串,然后把这 k 个子串按照其在字 ...

  6. LCIS tyvj1071 DP优化

    思路: f[i][j]表示n1串第i个与n2串第j个且以j结尾的LCIS长度. 很好想的一个DP. 然后难点是优化.这道题也算是用到了DP优化的一个经典类型吧. 可以这样说,这类DP优化的起因是发现重 ...

  7. 取数字(dp优化)

    取数字(dp优化) 给定n个整数\(a_i\),你需要从中选取若干个数,使得它们的和是m的倍数.问有多少种方案.有多个询问,每次询问一个的m对应的答案. \(1\le n\le 200000,1\le ...

  8. dp优化1——sgq(单调队列)

    该文是对dp的提高(并非是dp入门,dp入门者请先参考其他文章) 有时候dp的复杂度也有点大...会被卡. 这几次blog大多数会讲dp优化. 回归noip2017PJT4.(题目可以自己去百度).就 ...

  9. loj6171/bzoj4899 记忆的轮廊(期望dp+优化)

    题目: https://loj.ac/problem/6171 分析: 设dp[i][j]表示从第i个点出发(正确节点),还可以有j个存档点(在i点使用一个存档机会),走到终点n的期望步数 那么 a[ ...

随机推荐

  1. 山东省第四届acm.Rescue The Princess(数学推导)

    Rescue The Princess Time Limit: 1 Sec  Memory Limit: 128 MB Submit: 412  Solved: 168 [Submit][Status ...

  2. Truck History(prim & mst)

    Truck History Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 19772   Accepted: 7633 De ...

  3. HDU 4864 Task (贪心+STL多集(二分)+邻接表存储)(杭电多校训练赛第一场1004)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4864 解题报告:有n台机器用来完成m个任务,每个任务有一个难度值和一个需要完成的时间,每台机器有一个可 ...

  4. 5 个最受人喜爱的开源 Django 包

    导读 Django 围绕“可重用应用”的思想建立:自包含的包提供了可重复使用的特性.你可以将这些可重用应用组装起来,在加上适用于你的网站的特定代码,来搭建你自己的网站.Django 具有一个丰富多样的 ...

  5. How to: Set up Openswan L2TP VPN Server on CentOS 6

    Have you ever wanted to set up your own VPN server? By following the steps below, you can set up you ...

  6. UML基础:统一建模语言简介

    目录 背景知识 用例图 类图 序列图 状态图 活动图 组件图 部署图 结束语 英文原文:UML basics: An introduction to the Unified Modeling Lang ...

  7. Ninject学习笔记<一>

    本文转载自永远的阿哲 如果给您带来不便请联系博主. Ninject是一款.Net平台下的开源依赖注入框架.按照官方说法,它快如闪电.超级轻量,且充分利用了.Net的最新语法,使用Lambda表达式代替 ...

  8. 61. 从1到n,共有n个数字,每个数字只出现一次。从中随机拿走一个数字x,请给出最快的方法,找到这个数字。如果随机拿走k(k>=2)个数字呢?[find k missing numbers from 1 to n]

    [本文链接] http://www.cnblogs.com/hellogiser/p/find-k-missing-numbers-from-1-to-n.html  [题目] 从1到n,共有n个数字 ...

  9. python将json格式的数据转换成文本格式的数据或sql文件

    python如何将json格式的数据快速的转化成指定格式的数据呢?或者转换成sql文件? 下面的例子是将json格式的数据准换成以#_#分割的文本数据,也可用于生成sql文件. [root@bogon ...

  10. Android 启动画面

    如果你的程序初始化时间过长,那么在初始化之前,程序会现实一个空白的activity页,十分难看. 添加一个启动画面的方法就是为响应的activity加入自定义的Theme,并在theme中设定 and ...