[NOI2015]寿司晚宴(状压dp)
为了庆祝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取模)。注意一个人可以不吃任何寿司。
Solution
题意:有1-n-1这些数,把他们分给两个人(可以不分),使得从两个人各自任意拿出一个数,它们都是互质的。
注意到n是500,范围内小质数较少,可以考虑状压小质数。
但是大质数怎么处理?
我们可以设计状态为dp[i][j]表示做到了第i个大质数,当前小质数的选择情况为j时的方案数。
因为每个大质数只能给一个人,所以我们dp的阶段就是每个大质数。
最后统计答案时要注意,我们把都没选的情况考虑了两次,把多余的部分减去就可以了。
Code
#include<iostream>
#include<cstdio>
#include<algorithm>
#define N 509
#define R register
using namespace std;
int prime[N],mdiv[N],n,k,size,ma;
long long g[][<<][<<],f[<<][<<],mod,ans;
struct aaa
{
int a,b;
}ji[N];
bool cmp(aaa a,aaa b)
{
return a.b<b.b;
}
int main()
{
scanf("%d%lld",&n,&mod);
for(R int i=;i<=n;++i)
{
if(!mdiv[i])mdiv[i]=i,prime[++prime[]]=i;
for(R int j=;j<=prime[]&&((k=prime[j]*i)<=n);++j)
{
mdiv[k]=prime[j];
if(i%prime[j]==)break;
}
}
size=min(prime[],);
for(R int i=;i<=n;++i){
int tmp=i;
for(R int j=;j<=size;++j)
if(!(tmp%prime[j]))
{
while(!(tmp%prime[j]))tmp/=prime[j];
ji[i].a|=(<<j-);
}
ji[i].b=tmp;
}
sort(ji+,ji+n+,cmp);
ma=(<<size)-;
f[][]=;
for(R int i=;i<=n;++i){
if((ji[i].b==)||(ji[i].b!=ji[i-].b)){
for(R int j=;j<=ma;++j)
for(R int k=;k<=ma;++k)
g[][j][k]=g[][j][k]=f[j][k];
}
for(R int j=ma;j>=;--j)
for(R int k=ma;k>=;--k)
if(!(j&k)){
if(!(ji[i].a&j))(g[][j][k|ji[i].a]+=g[][j][k])%=mod;
if(!(ji[i].a&k))(g[][j|ji[i].a][k]+=g[][j][k])%=mod;
}
if((ji[i].b==)||(ji[i].b!=ji[i+].b))
for(R int j=;j<=ma;++j)
for(R int k=;k<=ma;++k)
if(!(j&k))
f[j][k]=(g[][j][k]+g[][j][k]-f[j][k]+mod)%mod;
}
for(R int i=;i<=ma;++i)
for(R int j=;j<=ma;++j)
if(!(i&j))
(ans+=f[i][j])%=mod;
cout<<ans;
return ;
}
[NOI2015]寿司晚宴(状压dp)的更多相关文章
- [NOI2015]寿司晚宴 --- 状压DP
[NOI2015]寿司晚宴 题目描述 为了庆祝NOI的成功开幕,主办方为大家准备了一场寿司晚宴. 小G和小W作为参加NOI的选手,也被邀请参加了寿司晚宴. 在晚宴上,主办方为大家提供了n−1种不同的寿 ...
- 【BZOJ4197】[Noi2015]寿司晚宴 状压DP+分解质因数
[BZOJ4197][Noi2015]寿司晚宴 Description 为了庆祝 NOI 的成功开幕,主办方为大家准备了一场寿司晚宴.小 G 和小 W 作为参加 NOI 的选手,也被邀请参加了寿司晚宴 ...
- B4197 [Noi2015]寿司晚宴 状压dp
这个题一开始想到了唯一分解定理,然后状压.但是显然数组开不下,后来想到每个数(n<500)大于19的素因子只可能有一个,所以直接单独存就行了. 然后正常状压dp就很好搞了. 题干: Descri ...
- bzoj4197 [Noi2015]寿司晚宴——状压DP
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4197 首先,两个人选的数都互质可以看作是一个人选了一个数,就相当于选了一个质因数集合,另一个 ...
- BZOJ 4197: [Noi2015]寿司晚宴 状压dp+质因数分解
挺神的一道题 ~ 由于两个人选的数字不能有互质的情况,所以说对于一个质因子来说,如果 1 选了,则 2 不能选任何整除该质因子的数. 然后,我们发现对于 1 ~ 500 的数字来说,只可能有一个大于 ...
- [NOI2015]寿司晚宴——状压dp
题目转化:将2~n的数分成两组,可以不选,使得这两组没有公共的质因子.求方案数. 选择了一个数,相当于选择了它的所有质因子. 30分: 发现,n<=30的时候,涉及到的质因子也就10个.2,3, ...
- 【BZOJ-4197】寿司晚宴 状压DP
4197: [Noi2015]寿司晚宴 Time Limit: 10 Sec Memory Limit: 512 MBSubmit: 694 Solved: 440[Submit][Status] ...
- BZOJ 4197 NOI 2015 寿司晚宴 状压DP
4197: [Noi2015]寿司晚宴 Time Limit: 10 Sec Memory Limit: 512 MBSubmit: 694 Solved: 440[Submit][Status] ...
- NOI 2015 寿司晚宴 (状压DP+分组背包)
题目大意:两个人从2~n中随意取几个数(不取也算作一种方案),被一个人取过的数不能被另一个人再取.两个人合法的取法是,其中一个人取的任何数必须与另一个人取的每一个数都互质,求所有合法的方案数 (数据范 ...
- [NOI2015][bzoj4197] 寿司晚宴 [状压dp+质因数]
题面 传送门 思路 首先,要让两个人选的数字全部互质,那么有一个显然的充要条件:甲选的数字的质因数集合和乙选的数字的质因数集合没有交集 30pt 这种情况下n<=30,也就是说可用的质数只有10 ...
随机推荐
- ShowDoc上手
ShowDoc是什么 每当接手一个他人开发好的模块或者项目,看着那些没有写注释的代码,我们都无比抓狂.文档呢?!文档呢?!Show me the doc !! 程序员都很希望别人能写技术文档,而自己却 ...
- MySQL经典编程问题
星期数的问题 1 计算日期是周几 这个问题看似很简单,可以用MySQL内置函数来计算 (1) weekday(date)其返回值是0-6,0代表Monday, 6代表Sunday: (2) dayof ...
- 遍历List过程中删除操作报java.util.ConcurrentModificationException错误
1:遍历List 同时 remove 元素,出现java.util.ConcurrentModificationException错误 @Test public void test3(){ List& ...
- Oracle创建表空间、用户以及给用户赋权
--创建表空间 create tablespace waterboss datafile 'd:\waterboss.dbf' size 100m autoextend on next 10m --创 ...
- 谈谈B-树和B+树及其应用
待更!!! B-树和B+树的应用:数据搜索和数据库索引 B+/-Tree原理及mysql的索引分析 从B树.B+树.B*树谈到R 树 B树.B-树.B+树.B*树
- hive条件函数
case相当于if,when相当于=:then是条件满足的结论.否则实行else后语句,一end结束
- python学习笔记(9)--函数
函数定义: def <函数名>(<参数(0个或多个)>): 函数体 return <返回值> 参数有非可选参数,和可选参数,可选参数放在参数列表的最后,可以为可选参 ...
- Eclipse:报错Failed to read artifact descriptor for org.springframework.boot:spring-boot-autoconfigure:jar:2.1.2.
导入SVN下载的MAVEN项目时springboot报错: pom.xml文件报错 Failed to read artifact descriptor for org.springframework ...
- How to execute a Stored Procedure with Entity Framework Code First
Recently I worked on a project, which I started as code first and then I forced to switch to Databas ...
- Nginx IP地址透传
L:119