【2012 Asia ChangChun Regional Contes】 [Math Magic] 动态规划
题目链接: https://acm.hdu.edu.cn/showproblem.php?pid=4427
解法:
- 题目m范围较小$m\leq 1000$,n 范围也较小 $n\leq 1000$, $k\leq 100$
- 可以枚举m的约数,很容易知道不会超过32个。
- 对于$\sum factor[i]= m$。类似背包,考虑dp[n][lcm][k]为结果,显然有递推式$\forall j \in \left [ 0,factors.length \right ) $ dp[ sum+ factor[j] ][ LCM( factor[i],factor[j]) ] [k+1] += dp[sum][factor[i]][k]
- 如果采用三维,容易超出内存,考虑使用滚动数组
- 代码如下
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.StreamTokenizer;
import java.util.*; public class Main {
static int MOD = 1_000_000_007; public static void main(String[] args) throws IOException {
StreamTokenizer st = new StreamTokenizer(new BufferedReader(new InputStreamReader(System.in)));
// PrintWriter out = new PrintWriter(new BufferedOutputStream(System.out));
while (st.nextToken() != StreamTokenizer.TT_EOF) {
int n, m, k;
n = (int) st.nval;
st.nextToken();
m = (int) st.nval;
st.nextToken();
k = (int) st.nval;
List<Integer> factorlist = getFactor(m); process(n, m, k, factorlist); }
// out.flush();
} public static void process(int n, int m, int k, List<Integer> factlist) {
factors = factlist.toArray(new Integer[factlist.size()]);
index = new int[1001];
for (int i = 0; i < factors.length; i++) {
index[factors[i]] = i;
} _LCM = new int[factors.length][factors.length];
for (int i = 0; i < factors.length; i++) {
for (int j = 0; j < factors.length; j++) {
_LCM[i][j] = LCM(factors[i], factors[j]);
}
} long ret = dp(n, m, k);
System.out.println(ret);
} public static int LCM(int a, int b) {
return a * b / gcd(a, b);
} public static int gcd(int a, int b) {
if (a % b == 0) {
return b;
}
return gcd(b, a % b);
} static int[] index; static int[][] _LCM;
static Integer[] factors; public static long dp(int n, int m, int k) {
long[][] mem = new long[n + 1][factors.length];
for (int i = 0; i < factors.length; i++) {
if (factors[i] <= n) {
mem[factors[i]][i] = 1;
}
} for (int step = 1; step < k; step++) {
long[][] next = new long[n + 1][factors.length];
for (int sum = 1; sum <= n; sum++) {
for (int i = 0; i < factors.length; i++) {
if (mem[sum][i] <= 0) {
continue;
}
for (int j = 0; j < factors.length && sum + factors[j] <= n; j++) {
next[sum + factors[j]][index[_LCM[i][j]]] += mem[sum][i];
next[sum + factors[j]][index[_LCM[i][j]]] %= MOD;
}
}
}
mem = next;
}
return mem[n][index[m]];
} public static List<Integer> getFactor(int n) {
List<Integer> list = new ArrayList<>();
for (int i = 1; i <= n; i++) {
if (n % i == 0) {
list.add(i);
}
}
return list;
}
}
【2012 Asia ChangChun Regional Contes】 [Math Magic] 动态规划的更多相关文章
- zoj 3659 Conquer a New Region The 2012 ACM-ICPC Asia Changchun Regional Contest
Conquer a New Region Time Limit: 5 Seconds Memory Limit: 32768 KB The wheel of the history roll ...
- HDU-4432-Sum of divisors ( 2012 Asia Tianjin Regional Contest )
Sum of divisors Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) ...
- HDU 4436 str2int(后缀自动机)(2012 Asia Tianjin Regional Contest)
Problem Description In this problem, you are given several strings that contain only digits from '0' ...
- [ZOJ 3662] Math Magic (动态规划+状态压缩)
题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3662 之前写过这道题,结果被康神吐槽说代码写的挫. 的确,那时候 ...
- 2012 Asia Chengdu Regional Contest
Browsing History http://acm.hdu.edu.cn/showproblem.php?pid=4464 签到 #include<cstdio> #include&l ...
- 2012 Asia Hangzhou Regional Contest
Friend Chains http://acm.hdu.edu.cn/showproblem.php?pid=4460 图的最远两点距离,任意选个点bfs,如果有不能到的点直接-1.然后对于所有距离 ...
- 2012 Asia JinHua Regional Contest
Draw Something http://acm.hdu.edu.cn/showproblem.php?pid=4450 o(n)统计输入每个数的平方和. #include<cstdio> ...
- HDU 4433 locker 2012 Asia Tianjin Regional Contest 减少国家DP
意甲冠军:给定的长度可达1000数的顺序,图像password像锁.可以上下滑动,同时会0-9周期. 每个操作.最多三个数字连续操作.现在给出的起始序列和靶序列,获得操作的最小数量,从起始序列与靶序列 ...
- HDU 4468 Spy(KMP+贪心)(2012 Asia Chengdu Regional Contest)
Description “Be subtle! Be subtle! And use your spies for every kind of business. ”― Sun Tzu“A spy w ...
- HDU 4467 Graph(图论+暴力)(2012 Asia Chengdu Regional Contest)
Description P. T. Tigris is a student currently studying graph theory. One day, when he was studying ...
随机推荐
- APB_AHB_AXI协议的简单介绍
一.AMBA概述 今天要介绍的三种嵌入式总线技术:APB.AHB.AXI,它们都属于AMBA 片上总线协议.所以,在介绍这几种总线技术之前,有必要先了解一下AMBA 片上总线协议是什么. AMBA ( ...
- java: -source 1.5 中不支持 diamond 运算符
1.问题说明 平常在用idea编译spring boot多模块项目时,老是无端提示: Error:(107, 55) java: -source 1.5 中不支持 diamond 运算符 (请使用 - ...
- 将PL/SQL代码封装在灵巧的包中
将代码封装在灵巧的包中 http://www.oracle.com/technetwork/issue-archive/2013/13-jan/o13plsql-1872456.html 绝大多数基于 ...
- pta-神坛
[神坛]pta *相邻两条边围成的三角形面积会是最小的 极角排序+叉积计算三角形面积 #include<bits/stdc++.h> #define int long long using ...
- harbor镜像仓搭建相关问题
1 环境 自己生成了SSL证书 证书目录与 harbor.cfg 文件中定义的路径需要一致 使用的是offline 包安装 执行 install.sh 脚本后,通过浏览器远程访问成功, 但是在别的机器 ...
- day03--实际操作演示linux系统挂载过程
# 第一步骤: 拥有一个存储设备-光驱,使光驱加载光盘 # 第二步骤: 在linux系统中找到光驱设备 ls -l /dev/cdrom # 第三步骤: 需要将存储设备进行 挂载 挂载命令语法格式: ...
- 06-Redis系列之-哨兵(Redis-Sentinel)和集群详解和搭建
主从架构高可用 主从架构存在的问题 主从复制,主节点发生故障,需要做故障转移.(可以手动转移:让其中一个slave变成master) 主从复制,只有主写数据,所以写能力和存储能力有限 总结:redis ...
- 【.Net Core】.Net Core 源码分析与深入理解 - 入口 Program.cs (一)
研究原因:学习 .Net Core 两年有余,实际项目也使用了一年半,自己的技术已经到了瓶颈,需要有一个突破,我觉得首先研究架构师的设计思想,其次分析一下.Net Core的源码,这将会是一个很好的学 ...
- Html飞机大战(十六): 完成"清除"敌机奖励类
好家伙, 我们先来尝试完成一个最简单的功能 正面buff: 1.消灭全图敌机 我们要先找一个好看一点的素材 把背景弄成透明的(搞了好久),感谢度娘的技术支持Photoshop中如何把图 ...
- 【Azure 服务总线】使用Azure Service Bus 时,出现证书错误: 所使用的证书具有无法验证的信任链
问题描述 在Azure中连接 Service Bus 服务发送消息时发生证书错误,抛出证书异常消息: 或 The X.509 certificate CN=servicebus.chinaclouda ...