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相关推荐

  1. [NOI2015]寿司晚宴(状态压缩动态规划)

    题目描述 为了庆祝NOI的成功开幕,主办方为大家准备了一场寿司晚宴.小G和小W作为参加NOI的选手,也被邀请参加了寿司晚宴. 在晚宴上,主办方为大家提供了n−1种不同的寿司,编号1,2,3,⋯,n-1 ...

  2. 0x56. 动态规划 - 状态压缩DP(习题详解 × 7)

    目录 Problem A. 最短Hamilton路径 ProblemB. 蒙德里安的梦想 Problem C. Corn Fields Problem D. 小国王 Problem E. 炮兵阵地 P ...

  3. POJ 2411 Mondriaan‘s Dream(最清楚好懂的状压DP讲解)(连通性状态压缩DP)

    poj 2411 Mondriaan's Dream(最清晰的状压DP解析) 闫氏DP大法好 我们这里是一列一列地来,因为是一个棋盘性的状态压缩DP,从哪个方向都一样 摆放的小方格总方案数 等价于 横 ...

  4. BZOJ1688|二进制枚举子集| 状态压缩DP

    Disease Manangement 疾病管理 Description Alas! A set of D (1 <= D <= 15) diseases (numbered 1..D) ...

  5. hdu1074 状态压缩dp+记录方案

    题意:       给你一些作业,每个作业有自己的结束时间和花费时间,如果超过结束时间完成,一天扣一分,问你把n个作业完成最少的扣分,要求输出方案. 思路:       状态压缩dp,记录方案数的地方 ...

  6. FZU-2218 Simple String Problem(状态压缩DP)

    原题地址: 题意: 给你一个串和两个整数n和k,n表示串的长度,k表示串只有前k个小写字母,问你两个不含相同元素的连续子串的长度的最大乘积. 思路: 状态压缩DP最多16位,第i位的状态表示第i位字母 ...

  7. 《算法竞赛进阶指南》打卡-基本算法-AcWing 91. 最短Hamilton路径:位运算、状态压缩dp、dp

    文章目录 题目解答 题目链接 题目解答 分析: 状态压缩dp是用二进制数来表示状态. 数据范围n = 20, 那么状态总量就是2202^{20}220个状态. 可以按照以下思路去思考: 哪些点被用过 ...

  8. 状态压缩DP AcWing算法提高课 (详解)

    基础课的状态压缩点这里 基础课中 蒙德里安的梦想 属于 棋盘式状态压缩dp,最短Hamilton路径 属于 集合状态压缩dp 1064. 小国王(棋盘式/基于连通性) 这种棋盘放置类问题,在没有事先知 ...

  9. hdu 5067(状态压缩dp)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5067 解题思路:这道题开始想复杂了,想用bfs去求出最短距离,其实没必要,因为题目中没有阻碍关系,所以 ...

  10. hdu 5418(状态压缩dp+Floyd)

    点击打开链接 解题思路:这道题目和TSP问题很相似,唯一不同的是同一个点可以重复走几次.... 这道题目只有16个顶点,所以很容易想到状态压缩dp,dp[i][j]表示到达顶点i时的状态为j的最小花费 ...

最新文章

  1. JVM(Java虚拟机)优化大全和案例实战
  2. seaborn 安装成功 + ImportError: DLL load failed: 找不到指定的模块 问题解决
  3. 机器学习中的基本数学知识
  4. S3C6410的Bootloader的两个阶段BL1和BL2编译相关学习
  5. [crypto]-50-base64_encode和base64_decode的C语言实现
  6. 优先级调度算法(C++实现)
  7. SimpleDateFormat和DateFormat类不是线程安全的。
  8. ArrayList 相关总结
  9. 【转】mybatis 自增主键配置
  10. 从小小题目逐步走进 JavaScript 异步调用
  11. 解决log4j:WARN No appenders could be found for logger
  12. WebService的知识总结(一)
  13. 小颖java源代码反编译_小颖JAVA源代码反编译工具下载|
  14. 《从零走向专业,面试产品经理岗位必须掌握的7个高效方法》
  15. 2019新买电脑必备软件
  16. 如何设置电脑桌面动态壁纸
  17. Nginx软件介绍及下载地址
  18. cmd 下登陆ftp及相关操作
  19. 【蓝桥杯嵌入式主板G4】第三章 点亮一个LED
  20. sersync实时同步 解决单点NFS单点故障问题

热门文章

  1. 漫谈边缘计算(四):赢家是软还是硬
  2. Python不再为字符集编码发愁,使用chardet轻松解决你的困扰。
  3. 【nodejs原理源码赏析(4)】深度剖析cluster模块源码与node.js多线程(上)
  4. windows绕开强制更新
  5. CSDN开设博客专栏的方法
  6. 无法安装 计算机缺失,还原安装程序Windows缺失的文件 - Windows Client | Microsoft Docs...
  7. mysql 存储过程排序_MYSQL查询节点的所有父节点,按层级排序的存储过程
  8. oracle当查询没有输出返回0,ORACLE技术问题专家问答五则
  9. java innodb存储引擎_InnoDB存储引擎简介
  10. linux网络流量监测工具,linux下网络流量监控工具