这题不错,可惜我还是太弱了,没想到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. 2019-9-2-win10-uwp-隐私声明

    title author date CreateTime categories win10 uwp 隐私声明 lindexi 2019-09-02 12:57:38 +0800 2018-2-13 1 ...

  2. 04.join与interrupt

    join加入 public class JoinDemo { public volatile static int i = 0; public static class AddThread exten ...

  3. 【leetcode】946. Validate Stack Sequences

    题目如下: Given two sequences pushed and popped with distinct values, return true if and only if this co ...

  4. javaweb判断当前请求是否为移动设备访问的方法

    由于移动端和pc端还是稍微有些区别的,我觉得最好是在一个地儿统一判断,而且不要改动原先的代码,这样可以从一定程度上减少bug的数量.我的想法是首先应该判断当前请求是否为移动端,然后设一个标识到sess ...

  5. QT文件和目录

    一.文件操作 QFile和QFileInfo: #include <QCoreApplication> #include <QFileInfo> #include <QS ...

  6. mysql学习-explain中的extra

    覆盖索引就是创建的索引和查询的字段正好个数顺序一致 using filesort:mysql使用了一个外部索引 ,而非表内索引顺序进行访问,,mysql无法利用索引完成的排序操作称为文件索引,如果你创 ...

  7. OC学习篇之---@property和@synthesize的使用

    在之前一片文章我们介绍了OC中的内存管理:http://blog.csdn.net/jiangwei0910410003/article/details/41924683,今天我们来介绍两个关键字的使 ...

  8. Losing session data in ASP.NET

    Losing session data in ASP.NET By default Response.Redirect terminates thread execution and there mi ...

  9. 用 Flask 来写个轻博客 (8) — (M)VC_Alembic 管理数据库结构的升级和降级

    Blog 项目源码:https://github.com/JmilkFan/JmilkFan-s-Blog 目录 目录 前文列表 扩展阅读 Alembic 查看指令 manager db 的可用选项 ...

  10. HSQL基本使用(linux),安装+Demo

    文章目录 下载 安装 运行 使用数据库 demo 注意 下载 http://sourceforge.net/projects/hsqldb/files/ 安装 将下载的包,解压到任意目录即可 运行 通 ...