ZOJ-3662 Math Magic 背包DP
这题不错,可惜我还是太弱了,没想到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的更多相关文章
- [ZOJ 3662] Math Magic (动态规划+状态压缩)
题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3662 之前写过这道题,结果被康神吐槽说代码写的挫. 的确,那时候 ...
- Math Magic(完全背包)
Math Magic Time Limit:3000MS Memory Limit:32768KB 64bit IO Format:%lld & %llu Submit Sta ...
- UVALive 6073 Math Magic
6073 Math MagicYesterday, my teacher taught us about m ...
- noj [1479] How many (01背包||DP||DFS)
http://ac.nbutoj.com/Problem/view.xhtml?id=1479 [1479] How many 时间限制: 1000 ms 内存限制: 65535 K 问题描述 The ...
- HDU 5119 Happy Matt Friends (背包DP + 滚动数组)
题目链接:HDU 5119 Problem Description Matt has N friends. They are playing a game together. Each of Matt ...
- Codeforces 922 E Birds (背包dp)被define坑了的一题
网页链接:点击打开链接 Apart from plush toys, Imp is a huge fan of little yellow birds! To summon birds, Imp ne ...
- 背包dp整理
01背包 动态规划是一种高效的算法.在数学和计算机科学中,是一种将复杂问题的分成多个简单的小问题思想 ---- 分而治之.因此我们使用动态规划的时候,原问题必须是重叠的子问题.运用动态规划设计的算法比 ...
- hdu 5534 Partial Tree 背包DP
Partial Tree Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://acm.hdu.edu.cn/showproblem.php?pid= ...
- 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 ...
随机推荐
- SVN版本管理 目录结构
一. SVN标准目录 Subversion有一个很标准的目录结构,是这样的.比如项目是 proj,svn地址为 svn://proj/,那么标准的 svn 布局是: 这是一个标准的布局,trunk为主 ...
- 2019 ICPC Universidad Nacional de Colombia Programming Contest C D J
C. Common Subsequence 题意:给出长度为n两个串,求两个串的最长公共子序列len,如果len>=0.99*n,两个串就是亲兄弟否则不是. 解法:朴素的求LCS的时间复杂度是O ...
- Vue的路有拦截与axios的封装
一丶首先我们先创建api与utils两个文件夹 二丶api文件夹里面新建文件api.js import request from "../utils/http" import qs ...
- 17.Priority优先级
/** * 优先级 */ public class PriorityDemo { public static class HightPriority extends Thread{ static in ...
- php图片无损压缩的问题解决
代码如下 <?php namespace App\Contract; use Carbon\Carbon; /** * 图片压缩封装类 * @author jackie <2019.11. ...
- flume源码
IDEA查看源码 IDEA快捷键 1 查看接口的实现类:Ctrl+Alt+B 选中按快捷键,然后跳到实现类的地方去 2 切换页面:Alt+<- 和 Alt+-> Alt+-> 3 查 ...
- hibernate 双向1对多
1: 还是用客户Customer和订单Order来解释: “一对多”的物理意义:一个客户可以有多个订单,某个订单只能归宿于一个客户. “双向”的物理意义:客户知道自己有哪些订单,订单也知道自己归宿于哪 ...
- ofbiz:找不到org.ofbiz.widget.ContentWorkerInterface的类文件
ofbiz编译报错: 找不到org.ofbiz.widget.DataResourceWorkerInterface的类文件 找不到org.ofbiz.widget.ContentWorkerInte ...
- Service系统服务(二):补充应用技巧、软连接与硬连接、man手册、zip备份、vim效率操作、自定义yum软件仓库、发布及测试yum仓库、编译安装软件包
一.补充应用技巧 目标: 本例要求掌握在运维中比较常用的一些扩展命令技巧的使用,完成下列小技巧操作: 1> 采用数值形式将目录/root的权限调整为 rwx------ 2> 将记录的 ...
- 使用cookie来做身份认证 转载https://www.cnblogs.com/sheldon-lou/p/9545726.html
文章是msdn的官方文档,链接在这里.其实也有中文的文档,这里还是想做一个记录. 文章有asp.net core 2.x 和1.x 版本,我这里就忽略1.x了. 下面先说几点额外的东西有助于理解. A ...