【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 ...
随机推荐
- Pandas练习
背景介绍 本数据集包括了2015年至2017年我国36个主要一线城市.特区的一些年度数据,包括产值.人口.就业.教育.医疗.经济贸易.房地产投资等方面. 包含文件: 2015年国内主要城市年度数据.c ...
- Pandas处理股票数据
import tushare as ts import pandas as pd # 下载茅台所有股票交易数据 # df = ts.get_k_data(code="600519" ...
- 【LGR-156-Div.3】洛谷网校 8 月普及组月赛 I & MXOI Round 1 & 飞熊杯 #2(同步赛)
[LGR-156-Div.3]洛谷网校 8 月普及组月赛 I & MXOI Round 1 & 飞熊杯 #2(同步赛) \(T1\) luogu P9581 宝箱 \(100pts\) ...
- IPFS 添加和管理文件
IPFS的文件有不同的模式 默认模式 默认模式下, 文件会被解析并存入blocks, 同时文件的结构被存入filestore, 因为IPFS是按内容寻址的文件系统, 在添加时最外层的目录名或文件名信息 ...
- CSS实现渐隐渐现效果
CSS实现渐隐渐现效果 实现渐隐渐现效果是比较常见的一种交互方式,通常的做法是控制display属性值在none和其它值之间切换,虽说功能可以实现,但是效果略显生硬,所以会有这样的需求--希望元素消失 ...
- Spring Boot图书管理系统项目实战-5.读者管理
导航: pre: 4.基础信息管理 next:6.图书管理 只挑重点的讲,具体的请看项目源码. 1.项目源码 需要源码的朋友,请捐赠任意金额后留下邮箱发送:) 2.页面设计 <!DOCTYPE ...
- 以二进制文件安装K8S之创建CA根证书
为etcd和Kubernetes服务启用基于CA认证的安全机制,需要CA证书进行配置. 如果组织能够提供统一的CA认证中心,则直接使用组织颁发的CA证书即可.如果没有统一的CA认证中心,则可以通过颁发 ...
- Jenkins流水线使用@Grab 导入Maven库
有个需求需要在pipeline中调用Java的SDK去执行业务 使用 @Grab 注解可以在Maven中导入Java 库, @Grab('org.apache.commons:commons-math ...
- 【Azure 应用服务】App Service for Linux 环境中为Tomcat页面修改默认的Azure 404页面
问题描述 在App Service Linux环境中,如部署Tomcat 应用后,如果访问的页面找不到,应用会返回一个由Azure生成的404页面,那么是否可以修改它呢? PS: 如果是App Ser ...
- Windows配置R语言、RStudio开发环境
本文介绍R语言及其集成开发环境RStudio的下载.安装方法. R语言是一个属于GNU操作系统的开源软件,在数据统计与分析.可视化等方面具有优秀的表现:而RStudio则是R语言的集成开发环境 ...