[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 ...
随机推荐
- asp.net mvc或者其他程序无法打开excel——解决方案,C#处理Excel文件
问题描述:今天处理Excel时遇到一个问题,本地使用Microsoft.Jet.OLEDB.4.0处理,正常完成了需求, 上传到服务器后发生了异常,通过排查发现问题出现在对Excel文件的读取上,然后 ...
- js根据ip自动获取地址(省市区)
HTML: <html> <head> <meta charset="utf-8"> <meta name="viewport& ...
- C\C++学习笔记 1
C++记录1 C的头文件为math.h C++的为 cmath using编译指令 namespace 区分不同产品的函数.Mics::cout Linux::cout cout << 即 ...
- javascript内置函数:toString()
不同对象有不同的实现方式. 1.Number对象: 语法:numberObject.toString([radix]) 参数:radix,可选/Number类型,指定的基数(进制数),支持[2,36] ...
- [转帖]linux sed命令
linux sed命令就是这么简单 https://www.cnblogs.com/wangqiguo/p/6718512.html 用到的最多的就是一个sed -i 's/nn/mm/' 的命令了. ...
- [转帖]CentOS 查看系统信息汇总
CentOS 查看系统信息汇总 http://blog.itpub.net/15498/viewspace-2637493/ 感觉应该是 centos相关的 改了下名字 日志文件说明 /var/log ...
- 【面试】MySQL的事务和索引
MySQL事务 MySQL事务主要用于处理操作量大,复杂度高的数据. 比如说,在人员管理系统中,你删除一个人员,你既需要删除人员的基本资料,也要删除和该人员相关的信息,如信箱,文章等等,这些数据库操作 ...
- Canvas & SVG
Canvas & SVG https://docs.microsoft.com/en-us/previous-versions/windows/internet-explorer/ie-dev ...
- loadrunner -vuser
在每个负载生成器上,安装 remote agent dispatcher(process) 和 loadrunner agent 控制器指示remote agent dispatcher 在load ...
- mesh函数
[t,W]=meshgrid([2:0.2:7],[0:pi/6:3*pi]); %设置时-频相平面网格点 Gs1=(1/(sqrt(2*pi)*a))*exp(-0.5*abs((t1-t)/a). ...