题目链接: https://acm.hdu.edu.cn/showproblem.php?pid=4427

解法:

  1. 题目m范围较小$m\leq 1000$,n 范围也较小 $n\leq 1000$, $k\leq 100$
  2. 可以枚举m的约数,很容易知道不会超过32个。
  3. 对于$\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]
  4. 如果采用三维,容易超出内存,考虑使用滚动数组
  5. 代码如下
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] 动态规划的更多相关文章

  1. 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 ...

  2. 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) ...

  3. HDU 4436 str2int(后缀自动机)(2012 Asia Tianjin Regional Contest)

    Problem Description In this problem, you are given several strings that contain only digits from '0' ...

  4. [ZOJ 3662] Math Magic (动态规划+状态压缩)

    题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3662 之前写过这道题,结果被康神吐槽说代码写的挫. 的确,那时候 ...

  5. 2012 Asia Chengdu Regional Contest

    Browsing History http://acm.hdu.edu.cn/showproblem.php?pid=4464 签到 #include<cstdio> #include&l ...

  6. 2012 Asia Hangzhou Regional Contest

    Friend Chains http://acm.hdu.edu.cn/showproblem.php?pid=4460 图的最远两点距离,任意选个点bfs,如果有不能到的点直接-1.然后对于所有距离 ...

  7. 2012 Asia JinHua Regional Contest

    Draw Something http://acm.hdu.edu.cn/showproblem.php?pid=4450 o(n)统计输入每个数的平方和. #include<cstdio> ...

  8. HDU 4433 locker 2012 Asia Tianjin Regional Contest 减少国家DP

    意甲冠军:给定的长度可达1000数的顺序,图像password像锁.可以上下滑动,同时会0-9周期. 每个操作.最多三个数字连续操作.现在给出的起始序列和靶序列,获得操作的最小数量,从起始序列与靶序列 ...

  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 ...

  10. 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 ...

随机推荐

  1. 【奶奶看了都会】2分钟学会制作最近特火的ikun幻术图

    1.效果展示 最近ikun幻术图特别火啊,在网上能找到各种各样的ikun姿势图片,这些图片都是AI绘制的,能和风景完美融合在一起,今天小卷就来教大家怎么做这种图片 先看看图片效果 B站视频链接: 仿佛 ...

  2. vue 导出多页pdf, window.print()实现

    如果你对分页打印没思路,而网上的现成方案又不适合,不妨进来看看,也许会对你有帮助. 由于工作环境是局域网,对于插件的安装有限制,所以排除了jspdf + html2canvas的实现方式:采用wind ...

  3. CF1861

    只做出 A,身败名裂 A 显然不管怎么排,13,31 总有一个会出现,看看哪个出现. B 给定两个 01 串,每次可以挑一个串的一个子串,要求两端相同,然后把这个子串全部变得和两端相同. 问经过若干次 ...

  4. 什么是TDD(一)

    引子 回顾 虽然我很早以前就听说单元测试,也曾经多次在项目中引入单元测试框架和单元测试的实践为代码质量的提升带来了一丝助力. 但这种方式更多的是从软件调试的角度出发,即将单元测试作为一种测试方法可用性 ...

  5. NC50454 A Simple Problem with Integers

    题目链接 题目 题目描述 给定数列 \(a[1],a[2], \dots,a[n]\) ,你需要依次进行q个操作,操作有两类: 1 l r x:给定l,r,x,对于所有 \(i \in[l,r]\) ...

  6. 使用RBF神经网络实现函数逼近

    python实现的RBF神经网络见:基于tensorflow的RBF神经网络案例 1 一元函数逼近 1.1 待逼近的函数 1.2代码 %%%%%%%%%%一元函数逼近%%%%%%%%%% clear, ...

  7. Event对象

    Event对象 Event对象表示在DOM中出现的事件,在DOM中有许多不同类型的事件,其主要使用基于Event对象作为主接口的二次接口,Event对象本身包含适用于所有事件的属性和方法. 描述 事件 ...

  8. Mysql错误消息 语言设置

    今天操作数据库的时候,mysql错误返回语句 ,一直报的是非英语的语言 ,百般纠结 ,简单的还大致能猜出意思 , 复杂了就会实在看不懂的 ,举个简单的如下: [Err] 1064 - Erreur d ...

  9. C++ 多线程的错误和如何避免(14)

    在 C++11 中,不要将 volatile 用于线程,仅限于 MMIO(内存映射) 简单的回答, 在声明变量类型之前添加 "volatile" 关键字不会使对该变量有任何方式的原 ...

  10. 硬件开发笔记(八): 硬件开发基本流程,制作一个USB转RS232的模块(七):创建基础DIP元器件(晶振)封装并关联原理图元器件

    前言   有了原理图,可以设计硬件PCB,在设计PCB之间还有一个协同优先动作,就是映射封装,原理图库的元器件我们是自己设计的.为了更好的表述封装设计过程,本文描述了创建晶振封装(DIP),将原理图的 ...