NOI 2015 寿司晚宴 (状压DP+分组背包)
题目大意:两个人从2~n中随意取几个数(不取也算作一种方案),被一个人取过的数不能被另一个人再取。两个人合法的取法是,其中一个人取的任何数必须与另一个人取的每一个数都互质,求所有合法的方案数
(数据范围毕竟很小,乍一看也不是啥打表找规律的题)
和我之前做过的一道题很类似hdu 6125,但这道题由于题面看起来很玄学,所以正解更难想
但还是 状压DP+分组背包 的套路
因为500以内的任何一个数,只会有一个大于19的质因子,所以对2 3 5 7 11 13 17 19这8个质数进行状压,然后每个数都质因数分解,把小于等于19的质因子存入状态,剩下的因子分组背包搞搞就行了,注意如果剩下的因子是1要单独算一组,否则会出大事情,比如2和3并不是同一组的,如果再来一个4,和2是同一组的,转移就会出错
具体DP的实现呢,定义是第一个人取了状态为s1的数,第二个人取了状态为s2的数
分组背包要把同一组的东西放到连续的一段序列上
对于这道题而言,如果某个人取了某一组的任何一个,那么这一组的其它物品也只能被这个人取/不取
所以额外定义两个状态f1,f2,含义和dp的意义是一样的,只不过在同一组内是f1和f2这两个状态自己和自己转移,然后把答案贡献给dp,即这一组对整体的贡献,然后把dp重新赋给f1,f2,再进行下一组背包
方程
由于f1,f2为了下一层转移,都被加了一次dp值,所以最后要减掉一个dp
即
而f1,f2转移也有技巧,常规的自己和自己转移为了避免传递性,要另外开一个数组进行转移。但因为这道题的转移方程都是位与|操作,具有递增性,所以倒序枚举就可以减少一些常数
#include <queue>
#include <cstdio>
#include <cstring>
#include <algorithm>
#define ui unsigned int
#define ll long long
#define il inline
#define N (1<<8)+3
#define inf 0x3f3f3f3f
using namespace std; int n;
ll p;
ll f1[N][N],f2[N][N],dp[N][N];
int pr[]={,,,,,,,};
struct node{
int w,f;
friend bool operator < (const node &a,const node &b){
if(a.w!=b.w) return a.w<b.w;
else return a.f<b.f;
}
}s[N];
void get_son()
{
for(int i=;i<=n;i++)
{
int x=i;
for(int j=;j<;j++)
{
if(x%pr[j]==) x/=pr[j],s[i].f|=(<<j);
while(x%pr[j]==) x/=pr[j];
}s[i].w=x;
}
} int main()
{
scanf("%d%lld",&n,&p);
get_son();
sort(s+,s+n+);
f1[][]=f2[][]=dp[][]=;
int m=(<<)-;
for(int i=;i<=n;i++)
{
for(int s1=m;s1>=;s1--)
for(int s2=m;s2>=;s2--){
if(!((s1|s[i].f)&s2)) f1[s1|s[i].f][s2]=(f1[s1|s[i].f][s2]+f1[s1][s2])%p;
if(!(s1&(s2|s[i].f))) f2[s1][s2|s[i].f]=(f2[s1][s2|s[i].f]+f2[s1][s2])%p;}
if(s[i].w==||s[i+].w!=s[i].w)
for(int s1=m;s1>=;s1--)
for(int s2=m;s2>=;s2--)
f1[s1][s2]=f2[s1][s2]=dp[s1][s2]=(f1[s1][s2]+f2[s1][s2]-dp[s1][s2]+p)%p;
}
ll ans=;
for(int s1=m;s1>=;s1--)
for(int s2=m;s2>=;s2--)
ans+=dp[s1][s2],ans%=p;
printf("%lld\n",ans);
return ;
}
NOI 2015 寿司晚宴 (状压DP+分组背包)的更多相关文章
- BZOJ 4197 NOI 2015 寿司晚宴 状压DP
4197: [Noi2015]寿司晚宴 Time Limit: 10 Sec Memory Limit: 512 MBSubmit: 694 Solved: 440[Submit][Status] ...
- NOIP模拟 乘积 - 状压dp + 分组背包
题目大意: 给出n和k,求从小于等于n的数中取出不超过k个,其乘积是无平方因子数的方案数.无平方因子数:不能被质数的平方整除. 题目分析: 10(枚举\(n\le8\)),40(简单状压\(n\le1 ...
- HDU - 6125: Free from square (状压DP+分组背包)
problem:给定N,K.表示你有数1到N,让你最多选择K个数,问有多少种方案,使得选择的数的乘积无平方因子数.N,K<500: solution:显然可以状压DP做,但是500以内的素数还是 ...
- 【BZOJ-4197】寿司晚宴 状压DP
4197: [Noi2015]寿司晚宴 Time Limit: 10 Sec Memory Limit: 512 MBSubmit: 694 Solved: 440[Submit][Status] ...
- [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 ...
- [NOI2015]寿司晚宴——状压dp
题目转化:将2~n的数分成两组,可以不选,使得这两组没有公共的质因子.求方案数. 选择了一个数,相当于选择了它的所有质因子. 30分: 发现,n<=30的时候,涉及到的质因子也就10个.2,3, ...
- [NOI2015][bzoj4197] 寿司晚宴 [状压dp+质因数]
题面 传送门 思路 首先,要让两个人选的数字全部互质,那么有一个显然的充要条件:甲选的数字的质因数集合和乙选的数字的质因数集合没有交集 30pt 这种情况下n<=30,也就是说可用的质数只有10 ...
随机推荐
- 当li设置为line-block时,元素之间出现间隙的原因和解决方法
原因 因为浏览器默认把inline元素之间的空白符(Tab.空格.换行)渲染成一个空格.而如下述代码,两个li元素之间的换行符被渲染成一个空格,则元素之间产生了间隙. 用Chrome浏览器将场景模拟出 ...
- Tarjan算法 (强联通分量 割点 割边)
变量解释: low 指当前节点在同一强连通分量(或环)能回溯到的dfn最小的节点 dfn 指当前节点是第几个被搜到的节点(时间戳) sta 栈 vis 是否在栈中 ans 指强连通分量的数量 top ...
- MySQL导入到SQLServer
Mysql是在Linux环境服务器,MSSQL在windows服务器上 1.在MSServer中安装VPN 2.为VPN配置Mysql服务器账号 3.账号中的文件 4.在MSSQL服务器上安装mysq ...
- 最小割Stoer-Wagner算法
最小割Stoer-Wagner算法 割:在一个图G(V,E)中V是点集,E是边集.在E中去掉一个边集C使得G(V,E-C)不连通,C就是图G(V,E)的一个割: 最小割:在G(V,E)的所有割中,边权 ...
- java cocurrent包
1. java.util.concurrent - Java 并发工具包 Java 5 添加了一个新的包到 Java 平台,java.util.concurrent 包.这个包包含有一系列能够让 Ja ...
- [Node.js] Proxy Requests for Local and Remote Service Parity
High availability apps require that no distinction be made between local and remote services. Attach ...
- ios-UI-汤姆猫德游戏实现
// // ViewController.m // UI-猜拳游戏 // // Created by jzq_mac on 15/7/15. // Copyright (c) 2015年 jz ...
- How to remove focus without setting focus to another control?
How to remove focus without setting focus to another control? Ask Question up vote 67 down vote favo ...
- Pocket英语语法---六、感官动词接不同的动词表示什么意思
Pocket英语语法---六.感官动词接不同的动词表示什么意思 一.总结 一句话总结:其实进行时一般是表示连续,动词原形一般表示常态,过去分词一般表示被动(或者完成). 感官动词接原型表示动作的一般情 ...
- AngularJS 下拉列表demo
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <script sr ...