[NOI2015]寿司晚宴

题目描述

为了庆祝NOI的成功开幕,主办方为大家准备了一场寿司晚宴。

小G和小W作为参加NOI的选手,也被邀请参加了寿司晚宴。

在晚宴上,主办方为大家提供了n−1种不同的寿司,编号1,2,3,⋯,n-1,其中第种寿司的美味度为i+1(即寿司的美味度为从2到n)。

现在小G和小W希望每人选一些寿司种类来品尝,他们规定一种品尝方案为不和谐的当且仅当:

小G品尝的寿司种类中存在一种美味度为x的寿司,小W品尝的寿司中存在一种美味度为y的寿司,而x与y不互质。

现在小G和小W希望统计一共有多少种和谐的品尝寿司的方案(对给定的正整数p取模)。

注意一个人可以不吃任何寿司

输入格式:

从文件dinner.in中读入数据。

输入文件的第1行包含2个正整数n,p中间用单个空格隔开,表示共有n种寿司,最终和谐的方案数要对p取模。

输出格式:

输出到文件dinner.out中。

输出一行包含1个整数,表示所求的方案模p的结果。

数据范围:

\(30pt : 2 <= n <= 30\)

\(50pt : 2 <= n <= 100\)

\(70pt : 2 <= n <= 200\)

\(100pt : 2 <= n <= 500\)

\(p <= 1000000000\)

嗯。。。。。。。。。怎么讲呢?虽然自己很快就想出来了,但是感觉自己还是很弱。

周六下午,一看这数据范围,\(O(n^{3})\)的\(DP\)

\(dp(i,j,k)\)表示枚举到第\(i\)个数字,第\(j\)个质数,第\(k\)个。。。。。哪来的三个维???

突然想到大佬提起过状压。

还能压什么?压因子啊。

看了下500以内的素数个数:94个。。。。。。不现实啊

突然想到\(\sqrt{500}=22\)内只有\(2,3,5,7,11,13,17,19\)这\(8\)个质数

\(dp(i,S)\)表示枚举到数字\(i\),因子状态为\(S\)

复杂度\(O(2^8*n)\)。。。。太小了吧。。。。。

不是两个集合吗?加一维:\(dp(i,S1,S2)\)表示枚举到数字\(i\),第一个集合的因子状态\(S1\),第二个\(S2\)

嗯。。。。。。大于\(\sqrt{n}\)的怎么办???

放置了一会去想其他题目,突然懂了大于\(\sqrt{n}\)的因子不会在一个一个数中出现两次,因此可以把每个大因子集合单独拿出来\(DP\)

???做完了???其实思路是差不多完了。

进入正题:

对于第一维根本没有必要保持,可以去掉。

设\(sta[i]\)表示\(i\)的因子状压出来的数字。

小因子转移方程:

\(dp(S1|sta[i],S2)=dp(S1|sta[i],S2)+dp(S1,S2)(sta[i]\;and\;S2==0)\)

\(dp(S1,S2|sta[i])=dp(S1,S2|sta[i])+dp(S1,S2)(sta[i]\;and\;S1==0)\)

而对于大因子,我们需要多开一维来记录大因子允许存在于第几个集合中

即\(f(0/1,S1,S2)\)

转移方程:(以下转移条件同上,略去)

\(f(0,S1|sta[i],S2)=f(0,S1|sta[i],S2)+f(0,S1,S2)\)

\(f(1,S1|sta[i],S2)=f(1,S1|sta[i],S2)+f(1,S1,S2)\)

而最后合并的时候,因为两个\(f\)数组中都考虑了大因子不存在的情况,因此要减去一个,减什么?

还有什么没有考虑大因子呢?

自然是\(dp(S1,S2)\)

大因子DP合并到小因子DP转移方程:

\(dp(S1,S2)=f(0,S1,S2)+f(1,S1,S2)-dp(S1,S2)\)

最后答案即为:

\(\sum_{i=0}^{2^{8}-1} \sum_{j=0}^{2^{8}-1} dp(i,j)\)

时间复杂度:\(O(n*2^{16})\)

补充:

模的是\(10^{10}\)是\(long\;\;long\)范围的,不能开\(int\)

卡常代码,不建议仿生,可以选择参考其他人的

代码在此

[NOI2015]寿司晚宴 --- 状压DP的更多相关文章

  1. 【BZOJ4197】[Noi2015]寿司晚宴 状压DP+分解质因数

    [BZOJ4197][Noi2015]寿司晚宴 Description 为了庆祝 NOI 的成功开幕,主办方为大家准备了一场寿司晚宴.小 G 和小 W 作为参加 NOI 的选手,也被邀请参加了寿司晚宴 ...

  2. B4197 [Noi2015]寿司晚宴 状压dp

    这个题一开始想到了唯一分解定理,然后状压.但是显然数组开不下,后来想到每个数(n<500)大于19的素因子只可能有一个,所以直接单独存就行了. 然后正常状压dp就很好搞了. 题干: Descri ...

  3. bzoj4197 [Noi2015]寿司晚宴——状压DP

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4197 首先,两个人选的数都互质可以看作是一个人选了一个数,就相当于选了一个质因数集合,另一个 ...

  4. BZOJ 4197: [Noi2015]寿司晚宴 状压dp+质因数分解

    挺神的一道题 ~ 由于两个人选的数字不能有互质的情况,所以说对于一个质因子来说,如果 1 选了,则 2 不能选任何整除该质因子的数. 然后,我们发现对于 1 ~ 500 的数字来说,只可能有一个大于 ...

  5. [NOI2015]寿司晚宴——状压dp

    题目转化:将2~n的数分成两组,可以不选,使得这两组没有公共的质因子.求方案数. 选择了一个数,相当于选择了它的所有质因子. 30分: 发现,n<=30的时候,涉及到的质因子也就10个.2,3, ...

  6. 【BZOJ-4197】寿司晚宴 状压DP

    4197: [Noi2015]寿司晚宴 Time Limit: 10 Sec  Memory Limit: 512 MBSubmit: 694  Solved: 440[Submit][Status] ...

  7. BZOJ 4197 NOI 2015 寿司晚宴 状压DP

    4197: [Noi2015]寿司晚宴 Time Limit: 10 Sec  Memory Limit: 512 MBSubmit: 694  Solved: 440[Submit][Status] ...

  8. NOI 2015 寿司晚宴 (状压DP+分组背包)

    题目大意:两个人从2~n中随意取几个数(不取也算作一种方案),被一个人取过的数不能被另一个人再取.两个人合法的取法是,其中一个人取的任何数必须与另一个人取的每一个数都互质,求所有合法的方案数 (数据范 ...

  9. [NOI2015][bzoj4197] 寿司晚宴 [状压dp+质因数]

    题面 传送门 思路 首先,要让两个人选的数字全部互质,那么有一个显然的充要条件:甲选的数字的质因数集合和乙选的数字的质因数集合没有交集 30pt 这种情况下n<=30,也就是说可用的质数只有10 ...

随机推荐

  1. BestCoder Round #40 解题报告

    这场是第一场没有米的BC... 大概也是想震一震那些一听说没米了就不打BC的人吧 这次的题目质量比以往高了许多 (然而我并没有打这一场BC 但是今天下午到现在做的过程中真的学到了不少知识呢 A题略水. ...

  2. 【leetcode 简单】第四十八题 旋转数组

    给定一个数组,将数组中的元素向右移动 k 个位置,其中 k 是非负数. 示例 1: 输入: [1,2,3,4,5,6,7] 和 k = 3 输出: [5,6,7,1,2,3,4] 解释: 向右旋转 1 ...

  3. Sublime删除项目删不掉?

    最近用sublime进行项目的开发,感觉懵逼的像个小白菜~~ 今天遇到的问题可是一个超级白痴的问题,sublime的空白项目文件夹怎么都删不掉,我的傻逼操作是:选中文件--->Delete--- ...

  4. PHP动态修改配置文件——php经典实例

    文件结构: index.php 主页 config 配置文件 doUpdate.php 修改功能页 index.php <html> <head> <title>修 ...

  5. VueJS $refs 在 ElementUI 中遇到的问题

    表单验证的时候  $refs 拿不到 暂且是用 $nextTick 解决,具体原因有待研究 假入在 created 中注册时间来验证 validate,那就放在mounted中 或者...注册了 ev ...

  6. ORA-01552 非系统表空间不能使用系统回滚段处理

    今天新搭建了一个10g的测试数据库,运行都很正常,但是在打开autotrace功能后执行语句,报错 SQL> set autotrace on SQL> select username,s ...

  7. mysql的一些规范

    我司的mysql规范,值得牢记 一.禁止内容 表字段类型 不推荐使用enum,set,blob,text等类型 表中所有字段都不能为空,需要设置not null属性,可以给默认值 表的主键列值禁止被更 ...

  8. html的loadrunner脚本2

    Action(){ char buf[1911]; //¶¨Òå×Ö·ûÊý×飬Ö÷ÒªÓÃÓÚдÈëXML±¨Îĵ½»º³åÇø char str_Body[4086]; //³Ð½Ó±¨Î ...

  9. tp 框架 利用反射实现对象调用方法

    <?php class Person{ public $name="xiaoming"; function say(){ echo "i am ".$th ...

  10. Ubuntu下安装Sublime Text3

    1. 下载软件 Ctrl+Alt+T 调出命令窗口执行下面命令下载安装包: sudo add-apt-repository ppa:webupd8team/sublime-text-3 2. 更新软件 ...