这题不错,可惜我还是太弱了,没想到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. WPF多线程更新UI的一个解决途径

    那么该如何解决这一问题呢?通常的做法是把耗时的函数放在线程池执行,然后切回主线程更新UI显示.前面的updateTime函数改写如下: private async void updateTime()  ...

  2. yum 仓库搭建与源码包安装实战

    目录 一.yum 仓库自建示例: 二.源码包安装实践 基础环境 服务端配置 下载及安装fpm软件 客户端: 一.yum 仓库自建示例: 1.安装ftp服务 yum -y install vsftpd ...

  3. Python之 set的特点

    set的内部结构和dict很像,唯一区别是不存储value,因此,判断一个元素是否在set中速度很快. set存储的元素和dict的key类似,必须是不变对象,因此,任何可变对象是不能放入set中的. ...

  4. 在 Visual Studio 中使用 Q# 进行量子编程

    1 量子计算机与量子编程 1.1 量子计算机 Quantum computing is computing using quantum-mechanical phenomena, such as su ...

  5. 杂谈、 素材资源,没有美工不会ps一样可以美观

    免费素材网站 阿里巴巴矢量图,大部分图标都有颜色像素可选,格式可选3种, http://www.iconfont.cn/plus/home/index?spm=a313x.7781069.199891 ...

  6. 【leetcode】688. Knight Probability in Chessboard

    题目如下: On an NxN chessboard, a knight starts at the r-th row and c-th column and attempts to make exa ...

  7. 【架构】Linux结构

    Linux系统一般有4个主要部分: 内核.shell.文件系统和应用程序.内核.shell和文件系统一起形成了基本的操作系统结构,它们使得用户可以运行程序.管理文件并使用系统.部分层次结构如图1-1所 ...

  8. Codeforces Round #420 (Div. 2) E. Okabe and El Psy Kongroo dp+矩阵快速幂

    E. Okabe and El Psy Kongroo   Okabe likes to take walks but knows that spies from the Organization c ...

  9. 常见sql操作

    1. select '`'||b.mrchno 商户号, b.name 商户名称, b.contact3 注册地址联系人, '`'||b.telno1 邮寄地址联系电话, a.MRCHT_NAME X ...

  10. 在idea下开发出现404错误

    用idea开发时,我们一般要设置project strucure里的Modules-Sources,里面对应的有Sources,tests,Resources,Test Resources, Excl ...