DP(优化) UVALive 6073 Math Magic
/************************************************
* Author :Running_Time
* Created Time :2015/10/28 星期三 20:20:09
* File Name :H.cpp************************************************/#include <cstdio>
#include <algorithm>
#include <iostream>
#include <sstream>
#include <cstring>
#include <cmath>
#include <string>
#include <vector>
#include <queue>
#include <deque>
#include <stack>
#include <list>
#include <map>
#include <set>
#include <bitset>
#include <cstdlib>
#include <ctime>
using namespace std;#define lson l, mid, rt << 1
#define rson mid + 1, r, rt << 1 | 1
typedef long long ll;
const int N = 1e3 + 10;
const int M = 1e2 + 10;
const int INF = 0x3f3f3f3f;
const int MOD = 1e9 + 7;
const double EPS = 1e-10;
const double PI = acos (-1.0);
int dp[2][N][N];
int lcm[N][N];
int vec[N];int GCD(int a, int b) {return b ? GCD (b, a % b) : a;
}void init(void) {for (int i=1; i<=1000; ++i) {for (int j=1; j<=1000; ++j) {lcm[i][j] = i * j / GCD (i, j);}}
}inline void add(int &x, int y) {x += y;if (x > MOD) x -= MOD;
}int main(void) {init ();int n, m, k;while (scanf ("%d%d%d", &n, &m, &k) == 3) {int t = 0;for (int i=1; i<=m; ++i) {if (m % i == 0) vec[t++] = i;}int now = 0;for (int i=0; i<=n; ++i) {for (int j=0; j<t; ++j) {dp[now][i][vec[j]] = 0;}}dp[now][0][1] = 1;for (int l=1; l<=k; ++l) {now ^= 1;for (int i=0; i<=n; ++i) {for (int j=0; j<t; ++j) {dp[now][i][vec[j]] = 0;}}for (int i=l-1; i<=n; ++i) {for (int j=0; j<t; ++j) {if (dp[now^1][i][vec[j]] == 0) continue;for (int p=0; p<t; ++p) {int x = i + vec[p];int y = lcm[vec[j]][vec[p]];if (x > n || m % y != 0) continue;dp[now][x][y] = (dp[now][x][y] + dp[now^1][i][vec[j]]) % MOD;}}}}printf ("%d\n", dp[now][n][m]);}//cout << "Time elapsed: " << 1.0 * clock() / CLOCKS_PER_SEC << " s.\n";return 0;
}
转载于:https://www.cnblogs.com/Running-Time/p/4918649.html
DP(优化) UVALive 6073 Math Magic相关推荐
- hdu3585 二分最大团(dp优化)
题意 给你一些点( <= 50),让你找到k个点,使得他们之间的最小距离最大. 思路: 求最小的最大,我们可以直接二分去枚举距离,但是要注意,不要去二分double找距离 ...
- hdu1505 暴力或dp优化
题意: 给你一个矩阵,让你在里面找到一个最大的f矩阵.. 思路: 三种方法ac这到题目; 方法(1) 以宽为主,暴力 开一个数组sum[i][j],记录当前这个位置的 ...
- [DP优化之平行四边形不等式]例题
目录 概述 例题 Post Office 题目描述 解题思路 总结 Monkey Party 题目链接 解题思路 总结 评述 概述 首先说明一点,这种方法不是什么题都可以用的,我们要判断DP的情况,看 ...
- [BZOJ1499][NOI2005][DP+优化]瑰丽华尔兹
[Problem Description] 你跳过华尔兹吗?当音乐响起,当你随着旋律滑动舞步,是不是有一种漫步仙境的惬意?众所周知,跳华尔兹时,最重要的是有好的音乐.但是很少有几个人知道,世界上最伟大 ...
- C++剑指offer:解题报告之DP优化学习记 (二) ——浅论DP斜率优化 (Print Article 【HDU - 3507】 )
链接:https://share.weiyun.com/5LzbzAc 目录 前言 斜率优化前期准备 1.从状态转移方程出发 2.推理状态转移方程 对结论的进一步推导 干货!综合结论 判断斜率大小的方 ...
- Coins(多重背包方案可行性dp + 优化)
Coins 题目 给出硬币面额及每种硬币的个数,求从1到m能凑出面额的个数. 思路 1.朴素的多重背包 题面给出的很明显的多重背包,定义dp为考虑前i种硬币,能凑出j元的方案可行性,可以得到第一版代码 ...
- 01背包问题dp优化
背包容量m给定,选择n件物品,求放入背包的最大价值. 其中,物品只能选择一次,要么放,要么不放. 朴素解法 经典的DP问题 状态:f[i][j]f[i][j]f[i][j]表示选择前iii个物品,背包 ...
- 【DP优化】【P1430】序列取数
传送门 Description 给定一个长为n的整数序列,由A和B轮流取数(A先取).每个人可从序列的左端或右端取若干个数(至少一个),但不能两端都取.所有数都被取走后,两人分别统计所取数的和作为各自 ...
- 2021牛客暑期多校训练营1 I-Increasing Subsequence(期望dp+优化)
I-Increasing Subsequence fi,j,0/1f_{i,j,0/1}fi,j,0/1表示上一轮第一个人选了iii,第二个人选了jjj,并且当前是第1/2个人选择的概率. 转移考虑 ...
最新文章
- RHEL6 64位系统安装ORACLE 10g 64bit 数据库
- 51nod 1065 最小正字段和 解决办法:set存前缀和,二分插入和二分查找
- MYSQL基础--学习笔记
- Qt Creator使用自定义着色器
- JVM调优总结(一)
- spring api层打包_Spring项目的按层打包已过时
- C++primer 第 5 章语句 5.2语句作用域 5.3条件语句 5 . 4 迭代语句 5.5跳转语句 5.6 try语句块和异常处理
- android 开源 数据库,Android开源数据库框架-LitePal的使用
- 浏览器插件----神奇的鼠标
- Java 帝国对 Python 的渗透能成功吗?
- perl 循环删除指定文件夹下所有满足条件的文件,不包含文件夹
- java框架--springmvc --ajax-json-upload/download+maven+ DES/MD5 请求加密
- mysql+mmm+主动模式_MySQL集群搭建(4)-MMM+LVS+Keepalived
- 河流干涸的原因可能是水循环被破坏
- 计算机联锁静态数据表,计算机联锁功能.doc
- TeX Live安装教程
- 【经验分享】用PS如何将图片的四角做成圆弧角
- 如何批量生成ISBN条码
- 全网最全实战注册苹果开发者账号教程
- 亿速云服务器清理,如何清理docker产生的垃圾文件