为了庆祝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)的更多相关文章

  1. [NOI2015]寿司晚宴 --- 状压DP

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

随机推荐

  1. HTML 5 Web 音频

    HTML 5 音频http://www.w3school.com.cn/html5/html_5_audio.asp 在 Web 上播放音频http://www.w3school.com.cn/med ...

  2. 994.Contiguous Array 邻近数组

    描述 Given a binary array, find the maximum length of a contiguous subarray with equal number of 0 and ...

  3. POJ_1185_炮兵阵地 dp+状态压缩

    题目:炮兵阵地 链接:http://poj.org/problem?id=1185 解题思路: 首先用 int 来表示每一行的情况,比如说第一行是k1,那么[ k1&(k1>>2) ...

  4. 利用js给datalist或select动态添加option选项

    <!DOCTYPE html> <html> <head> <title>鼠标点击时加载</title> <script type=& ...

  5. Jquery ajax传递xml方式在ie8下兼容问题

    主要问题就是ie8把xml格式在打开的时候转换成了string,我们只用把其转换回xml就可以了. $.ajax({ type:’GET’, url:’list.php?pagenow=’+count ...

  6. PHP的爬虫框架

    Beanbun PHPSpider PHPQuery QueryList PHPCrawer Snoopy

  7. jdbc一点小笔记

    JDBC的常用接口的步骤, 1使用Driver或者Class.forName()进行注册驱动: 2使用DriverManager进行获取数据库的链接.使用Connection获取语句对象.使用语句对象 ...

  8. python 编码格式

    1. 字符编码简介 1.1. ASCII ASCII(American Standard Code for Information Interchange),是一种单字节的编码.计算机世界里一开始只有 ...

  9. vue 子组件修改父组件传来的props值,报错

    vue不推荐直接在子组件中修改父组件传来的props的值,会报错 [Vue warn]: Avoid mutating a prop directly since the value will be ...

  10. extensions

    extensions.blocklist.enabled