【BZOJ4197】寿司晚宴,状态压缩DP
Time:2016.06.29
Author:xiaoyimi
转载注明出处谢谢
传送门
思路:
比较巧妙的处理方法
关于互质这个问题很多都是出现在数论题目里
显然这个不是……
看到500这个数据范围,我首先想到的是网络流,咳咳……
好吧这也不是(用脚趾头都能想出来如果是网络流的话会让你求方案数+取模?)
500−−−√=22.36...\sqrt{500}=22.36...
这个范围内的质数只有8个
似乎可以状压了吧……
也就是说,我们把两个人所吃的寿司看做是两个质数(实际上是质因子)的集合,一个人吃一个寿司就往这个人的集合里扔若干个质因子,只要这其中没有公共的质数就可以了
大于22的质数怎么办……
每个数最多只有一个大于22的质因子,拆解出来,排序分开计算了,把大于22的相同的质因子的数放到一起去
DP的方法也很巧妙……
类似背包那样做,避免重复计算
f=g+h-f
(因为g,h中各有一个之前的f值)
算了我还是先去食堂抢饭了
代码:
#include<cstdio>
#include<iostream>
#include<algorithm>
using namespace std;
int n,mo,ans;
int f[256][256],g[256][256],h[256][256],p[9]={0,2,3,5,7,11,13,17,19};
struct node{int k,fac;
}a[502];
bool cmp(node a,node b){return a.k<b.k;}
void cal(node &x,int num)
{for (int i=1;i<=8;i++)if (num%p[i]==0){x.fac|=1<<i-1;while (num%p[i]==0) num/=p[i];}x.k=num;
}
main()
{scanf("%d%d",&n,&mo);for (int i=2;i<=n;i++)cal(a[i],i);sort(a+2,a+n+1,cmp);f[0][0]=1;for (int v=2;v<=n;v++){if (a[v].k!=a[v-1].k||a[v].k==1)for (int i=255;i>=0;i--)for (int j=255;j>=0;j--)if (!(i&j)) g[i][j]=h[i][j]=f[i][j];for (int i=255;i>=0;i--)for (int j=255;j>=0;j--)if (!(i&j)){if (!(a[v].fac&j)) g[i|a[v].fac][j]=(g[i][j]+g[i|a[v].fac][j])%mo;if (!(a[v].fac&i)) h[i][j|a[v].fac]=(h[i][j]+h[i][j|a[v].fac])%mo;}if (a[v].k!=a[v+1].k||a[v].k==1)for (int i=255;i>=0;i--)for (int j=255;j>=0;j--)if (!(i&j)) f[i][j]=((g[i][j]+h[i][j])%mo-f[i][j])%mo;}for (int i=255;i>=0;i--)for (int j=255;j>=0;j--)if (!(i&j))ans=(ans+f[i][j])%mo;printf("%d",(ans%mo+mo)%mo);
}
【BZOJ4197】寿司晚宴,状态压缩DP相关推荐
- [NOI2015]寿司晚宴(状态压缩动态规划)
题目描述 为了庆祝NOI的成功开幕,主办方为大家准备了一场寿司晚宴.小G和小W作为参加NOI的选手,也被邀请参加了寿司晚宴. 在晚宴上,主办方为大家提供了n−1种不同的寿司,编号1,2,3,⋯,n-1 ...
- 0x56. 动态规划 - 状态压缩DP(习题详解 × 7)
目录 Problem A. 最短Hamilton路径 ProblemB. 蒙德里安的梦想 Problem C. Corn Fields Problem D. 小国王 Problem E. 炮兵阵地 P ...
- POJ 2411 Mondriaan‘s Dream(最清楚好懂的状压DP讲解)(连通性状态压缩DP)
poj 2411 Mondriaan's Dream(最清晰的状压DP解析) 闫氏DP大法好 我们这里是一列一列地来,因为是一个棋盘性的状态压缩DP,从哪个方向都一样 摆放的小方格总方案数 等价于 横 ...
- BZOJ1688|二进制枚举子集| 状态压缩DP
Disease Manangement 疾病管理 Description Alas! A set of D (1 <= D <= 15) diseases (numbered 1..D) ...
- hdu1074 状态压缩dp+记录方案
题意: 给你一些作业,每个作业有自己的结束时间和花费时间,如果超过结束时间完成,一天扣一分,问你把n个作业完成最少的扣分,要求输出方案. 思路: 状态压缩dp,记录方案数的地方 ...
- FZU-2218 Simple String Problem(状态压缩DP)
原题地址: 题意: 给你一个串和两个整数n和k,n表示串的长度,k表示串只有前k个小写字母,问你两个不含相同元素的连续子串的长度的最大乘积. 思路: 状态压缩DP最多16位,第i位的状态表示第i位字母 ...
- 《算法竞赛进阶指南》打卡-基本算法-AcWing 91. 最短Hamilton路径:位运算、状态压缩dp、dp
文章目录 题目解答 题目链接 题目解答 分析: 状态压缩dp是用二进制数来表示状态. 数据范围n = 20, 那么状态总量就是2202^{20}220个状态. 可以按照以下思路去思考: 哪些点被用过 ...
- 状态压缩DP AcWing算法提高课 (详解)
基础课的状态压缩点这里 基础课中 蒙德里安的梦想 属于 棋盘式状态压缩dp,最短Hamilton路径 属于 集合状态压缩dp 1064. 小国王(棋盘式/基于连通性) 这种棋盘放置类问题,在没有事先知 ...
- hdu 5067(状态压缩dp)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5067 解题思路:这道题开始想复杂了,想用bfs去求出最短距离,其实没必要,因为题目中没有阻碍关系,所以 ...
- hdu 5418(状态压缩dp+Floyd)
点击打开链接 解题思路:这道题目和TSP问题很相似,唯一不同的是同一个点可以重复走几次.... 这道题目只有16个顶点,所以很容易想到状态压缩dp,dp[i][j]表示到达顶点i时的状态为j的最小花费 ...
最新文章
- JVM(Java虚拟机)优化大全和案例实战
- seaborn 安装成功 + ImportError: DLL load failed: 找不到指定的模块 问题解决
- 机器学习中的基本数学知识
- S3C6410的Bootloader的两个阶段BL1和BL2编译相关学习
- [crypto]-50-base64_encode和base64_decode的C语言实现
- 优先级调度算法(C++实现)
- SimpleDateFormat和DateFormat类不是线程安全的。
- ArrayList 相关总结
- 【转】mybatis 自增主键配置
- 从小小题目逐步走进 JavaScript 异步调用
- 解决log4j:WARN No appenders could be found for logger
- WebService的知识总结(一)
- 小颖java源代码反编译_小颖JAVA源代码反编译工具下载|
- 《从零走向专业,面试产品经理岗位必须掌握的7个高效方法》
- 2019新买电脑必备软件
- 如何设置电脑桌面动态壁纸
- Nginx软件介绍及下载地址
- cmd 下登陆ftp及相关操作
- 【蓝桥杯嵌入式主板G4】第三章 点亮一个LED
- sersync实时同步 解决单点NFS单点故障问题
热门文章
- 漫谈边缘计算(四):赢家是软还是硬
- Python不再为字符集编码发愁,使用chardet轻松解决你的困扰。
- 【nodejs原理源码赏析(4)】深度剖析cluster模块源码与node.js多线程(上)
- windows绕开强制更新
- CSDN开设博客专栏的方法
- 无法安装 计算机缺失,还原安装程序Windows缺失的文件 - Windows Client | Microsoft Docs...
- mysql 存储过程排序_MYSQL查询节点的所有父节点,按层级排序的存储过程
- oracle当查询没有输出返回0,ORACLE技术问题专家问答五则
- java innodb存储引擎_InnoDB存储引擎简介
- linux网络流量监测工具,linux下网络流量监控工具