这题不错,可惜我还是太弱了,没想到qwq。

看了网上大佬题解之后写的,对比了一下代码,好像我写的还是挺简洁的(逃,只是吞行比较多)。

因为直接用lcm的值做下标会超时,所以我们观察发现可以组成lcm为m的,其实只可能是m的因子。所以我们预处理出所有m的因子放到a数组里。然后开始DP:

dp[i][j][k]代表选前i个数,和为j,lcm为a[k]的方案数。假设LCM(a,b)=c,因为知道a和c求b不容易,而知道a和b求c很容易,所以这里我们会采用刷表法。

另外即使我们已经优化了,因为ZOJ卡时间比较紧,所以还得预处理任两个数的lcm。

具体细节请看代码:

#include<bits/stdc++.h>
using namespace std;
const int N=1e3+;
const int MOD=1e9+;
int n,m,p,cnt;
int a[N],lcm[N][N],dp[][N][]; int gcd(int a,int b) { return b== ? a : gcd(b,a%b); } int main()
{
for (int i=;i<=;i++)
for (int j=;j<=;j++)
lcm[i][j]=i*j/gcd(i,j);
while (scanf("%d%d%d",&n,&m,&p)==) {
cnt=; for (int i=;i<=m;i++) if (m%i==) a[++cnt]=i; memset(dp,,sizeof(dp));
for (int i=;i<=cnt;i++) dp[][a[i]][i]=;
for (int i=;i<p;i++) { //填i个数
int now=i%,nxt=now^;
memset(dp[nxt],,sizeof(dp[nxt]));
for (int j=;j<=n;j++) //前i个数和为j
for (int k=;k<=cnt;k++) { //前i个数lcm为a[k]
for (int t=;t<=cnt;t++) //下个位置(i+1)填a[t]
if (j+a[t]<=n && lcm[a[k]][a[t]]<=m) {
int tmp=lower_bound(a+,a+cnt+,lcm[a[k]][a[t]])-a;
dp[nxt][j+a[t]][tmp]+=dp[now][j][k];
dp[nxt][j+a[t]][tmp]%=MOD;
}
}
}
cout<<dp[p%][n][cnt]<<endl;
}
return ;
}

ZOJ-3662 Math Magic 背包DP的更多相关文章

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

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

  2. Math Magic(完全背包)

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

  3. UVALive 6073 Math Magic

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

  4. noj [1479] How many (01背包||DP||DFS)

    http://ac.nbutoj.com/Problem/view.xhtml?id=1479 [1479] How many 时间限制: 1000 ms 内存限制: 65535 K 问题描述 The ...

  5. HDU 5119 Happy Matt Friends (背包DP + 滚动数组)

    题目链接:HDU 5119 Problem Description Matt has N friends. They are playing a game together. Each of Matt ...

  6. Codeforces 922 E Birds (背包dp)被define坑了的一题

    网页链接:点击打开链接 Apart from plush toys, Imp is a huge fan of little yellow birds! To summon birds, Imp ne ...

  7. 背包dp整理

    01背包 动态规划是一种高效的算法.在数学和计算机科学中,是一种将复杂问题的分成多个简单的小问题思想 ---- 分而治之.因此我们使用动态规划的时候,原问题必须是重叠的子问题.运用动态规划设计的算法比 ...

  8. hdu 5534 Partial Tree 背包DP

    Partial Tree Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://acm.hdu.edu.cn/showproblem.php?pid= ...

  9. HDU 5501 The Highest Mark 背包dp

    The Highest Mark Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://acm.hdu.edu.cn/showproblem.php?p ...

随机推荐

  1. Java高级应用(一)

    下面来介绍一下Java的高级应用有哪些. Java高级应用 第一讲 类加载 (一).类加载 类加载器是一个特殊的类,负责在运行时寻找和加载类文件.Java允许使用不同的类加载器,甚至是自定义类加载器. ...

  2. Spring高频率面试题

    1.Spring怎样定义类的作用域 通过bean 定义中的scope属性来定义. 2.Spring支持的几种bean的作用域 支持以下五种bean的作用域: singleton : bean在每个Sp ...

  3. 手写Spring事务框架

    Spring事务基于AOP环绕通知和异常通知 编程事务 声明事务 Spring事务底层使用编程事务+AOP进行包装的   = 声明事务 AOP应用场景:  事务 权限 参数验证 什么是AOP技术 AO ...

  4. Windows下JDK安装步骤 + eclipse集成配置

    一.JDK环境配置 1.解压到java目录下 2.路径和上面路径一致 3.配置path路径 4.查看版本 二.Eclipse配置 1.编译版本 2.运行环境 3.默认字集 4.字体大小

  5. 阿里云重磅发布RDS for SQL Server AlwaysOn集群版

    2018年双十一刚过,阿里云数据库发布RDS for SQL Server AlwaysOn集群版,这是业界除微软云SQL Database外,首家云计算公司基于SQL Server最新AlwaysO ...

  6. Json中判断是JSONArray还是JSONObject

    聪明的人总是能想到别人会遇到的问题,提前给出解决方案. List propList = new ArrayList(); //装载数据的list JSONArray array= JSONArray. ...

  7. 2019牛客多校第四场D-triples I 贪心

    D-triples 题意 给你一个\(n\),问至少有几个数或运算起来可以等于\(n\),并且输出数量和这个几个数.题目说明给的\(n\)一定符合条件(不会输出\(n= 1\) 之类不存在情况). 思 ...

  8. pycharm 代码无法自动补全(自动顺带)的解决方法

    pycharm 中输入关键字等,代码不能自动补全,这种情况一般是pycharm设置了省电模式 点击 File —Power Save Mode,取消勾选 再次输入,代码可以自动顺带出来了

  9. 建站手册-浏览器信息:Internet Explorer 浏览器

    ylbtech-建站手册-浏览器信息:Internet Explorer 浏览器 1.返回顶部 1. http://www.w3school.com.cn/browsers/browsers_inte ...

  10. Linux内核TSS的使用

    参见文章:http://blog.chinaunix.net/uid-22695386-id-272098.html linux2.4之前的内核有进程最大数的限制,受限制的原因是,每一个进程都有自已的 ...