BZOJ_4197_[Noi2015]寿司晚宴_状态压缩动态规划

Description

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

在晚宴上,主办方为大家提供了 n−1 种不同的寿司,编号 1,2,3,…,n−1,其中第 i 种寿司的美味度为 i+1 (即寿司的美味度为从 2 到 n)。
现在小G 和小 W 希望每人选一些寿司种类来品尝,他们规定一种品尝方案为不和谐的当且仅当:小 G 品尝的寿司种类中存在一种美味度为 x 的寿司,小 W 品尝的寿司中存在一种美味度为 y 的寿司,而 x 与 y 不互质。
现在小 G 和小 W 希望统计一共有多少种和谐的品尝寿司的方案(对给定的正整数 p 取模)。注意一个人可以不吃任何寿司。

Input

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

Output

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

Sample Input

3 10000

Sample Output

9

HINT

2≤n≤500

0<p≤1000000000

考虑状压每个质因子。。。
500以内的质数有九十多个,但是一些超过$\sqrt{n}$ 的质因子在一个数中最多出现一次。
于是把前$8$ 个质数压成二进制,对每个数求一遍状态和他包含的大质数。
把含有大质数相同的一起处理。
设$f[i][j]$ 表示第一个人选的状态为$i$, 第二个人选的状态为$j$的方案数。
$g[i][j]$表示第一个人不选这个大质数的方案数,$h[i][j]$表示第二个数不选这个大质数的方案数
让初始$g[i][j]=h[i][j]=f[i][j]$
转移后$f[i][j]=g[i][j]+h[i][j]-f[i][j]$
注意枚举顺序
 
代码:

#include <stdio.h>
#include <string.h>
#include <algorithm>
#include <stdlib.h>
using namespace std;
int mod,f[266][266],g[266][266],h[266][266];
int mask=255,n;
int pr[22];
struct A {
int val,lp;
}a[550];
bool cmp(const A &x,const A &y){return x.lp<y.lp;}
int main() {
scanf("%d%d",&n,&mod);
int i,j,k,l;
pr[2]=0; pr[3]=1; pr[5]=2; pr[7]=3; pr[11]=4; pr[13]=5; pr[17]=6; pr[19]=7;
for(i=2;i<=n;i++) {
int tmp=i;
for(j=2;j*j<=tmp;j++) {
if(tmp%j==0) {
a[i-1].val|=(1<<pr[j]);
while(tmp%j==0) tmp/=j;
}
}
if(tmp!=1) {
if(tmp>19) a[i-1].lp=tmp;
else a[i-1].val|=(1<<pr[tmp]);
}
}
int lst=1;
sort(a+1,a+n,cmp);
f[0][0]=1;
for(i=1;i<n;i=lst+1) {
if(a[i].lp) {
while(lst<n-1&&a[lst+1].lp==a[i].lp) lst++;
for(j=0;j<=mask;j++) {
for(k=0;k<=mask;k++) {
g[j][k]=h[j][k]=f[j][k];
}
}
for(j=i;j<=lst;j++) {
for(k=mask;k>=0;k--) {
for(l=mask;l>=0;l--) {
if(!(k&l)&&!(a[j].val&l)) {
g[k|a[j].val][l]=(g[k|a[j].val][l]+g[k][l])%mod;
h[l][k|a[j].val]=(h[l][k|a[j].val]+h[l][k])%mod;
}
}
}
}
for(j=0;j<=mask;j++) {
for(k=0;k<=mask;k++) {
f[j][k]=((g[j][k]+h[j][k]-f[j][k])%mod+mod)%mod;
}
}
}else {
lst=i;
for(j=0;j<=mask;j++) {
for(k=0;k<=mask;k++) {
g[j][k]=f[j][k];
}
}
for(j=0;j<=mask;j++) {
for(k=0;k<=mask;k++) {
if(!(a[i].val&k)&&!(j&k)) {
(f[j|a[i].val][k]+=g[j][k])%=mod;
(f[k][j|a[i].val]+=g[k][j])%=mod;
}
}
}
}
}
int ans=0;
for(i=0;i<=mask;i++) {
for(j=0;j<=mask;j++) {
if(!(i&j)&&f[i][j]) ans=(ans+f[i][j])%mod;
}
}
printf("%d\n",ans);
}
 
 

BZOJ_4197_[Noi2015]寿司晚宴_状态压缩动态规划的更多相关文章

  1. BZOJ 4197: [Noi2015]寿司晚宴 状态压缩 + 01背包

    4197: [Noi2015]寿司晚宴 Time Limit: 10 Sec  Memory Limit: 512 MB Description 为了庆祝 NOI 的成功开幕,主办方为大家准备了一场寿 ...

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

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

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

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

  4. [BZOJ4197][Noi2015]寿司晚宴

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

  5. BZOJ 4197: [Noi2015]寿司晚宴( dp )

    N^0.5以内的质数只有8个, dp(i, j, k)表示用了前i个大质数(>N^0.5), 2人选的质数(<=N^0.5)集合分别为j, k时的方案数. 转移时考虑当前的大质数p是给哪个 ...

  6. 状态压缩动态规划 状压DP

    总述 状态压缩动态规划,就是我们俗称的状压DP,是利用计算机二进制的性质来描述状态的一种DP方式 很多棋盘问题都运用到了状压,同时,状压也很经常和BFS及DP连用,例题里会给出介绍 有了状态,DP就比 ...

  7. [UOJ#129][BZOJ4197][Noi2015]寿司晚宴

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

  8. 【bzoj4197】[Noi2015]寿司晚宴 分解质因数+状态压缩dp

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

  9. NOI2015 寿司晚宴

    今年NOI确实是在下输了.最近想把当时不会做的题都写一下. 题意 从2到n(500)这些数字中,选若干分给A,若干分给B,满足不存在:A的某个数和B的某个数的GCD不等于1. 对于寿司晚宴这题,标准解 ...

随机推荐

  1. oracle的for和i++

    很长时间没用oracle的储存了,这次用到一次i++i++的sql语句:declarei_1 number(30) :=0;begin i_1 :=i_1+1;//i_1=1 insert into ...

  2. java四大特性理解(封装继承多态抽象)

    封装: 封装是把过程和数据包围起来,对数据的访问只能通过已定义的接口.面向对象计算始于这个基本概念,即现实世界可以被描绘成一系列完全自治.封装的对象,这些对象通过一个受保护的接口访问其他对象.封装是一 ...

  3. Kali Linux Live USB初始化+使用日记

    1.Live USB制作官方guide:Making a Kali Bootable USB Drive:https://docs.kali.org/downloading/kali-linux-li ...

  4. Django push: Using Server-Sent Events and WebSocket with Django

    http://curella.org/blog/2012/jul/17/django-push-using-server-sent-events-and-websocket/ The goal of ...

  5. java面试题,附个人理解答案

    一,面向对象的特征:1.抽象 包括数据抽象跟行为抽象,将对象共同的特征取出形成一个类2.继承 被继承类为基类/超类,继承类为子类/派生类3.封装 多次使用道德数据或方法,封装成类,方便多次重复调用4. ...

  6. Oracle12c中数据泵新特性之功能增强(expdp, impdp)

    Oracle的数据泵功能在10g中被引进.本文对数据泵在12c中的增强做一个概览. 1.   禁用日志选项(DISABLE_ARCHIVE_LOGGING) Impdp的TRANSFORM参数已经扩展 ...

  7. XGBoost算法--学习笔记

    学习背景 最近想要学习和实现一下XGBoost算法,原因是最近对项目有些想法,准备做个回归预测.作为当下比较火的回归预测算法,准备直接套用试试效果. 一.基础知识 (1)泰勒公式 泰勒公式是一个用函数 ...

  8. Python测试远程端口连接时间

    问题 最近自己服务器访问别人的服务器,有时候会报超时错误,有时候又能够正常访问别人服务器. 思路 最开始猜测是网络不稳定造成的,但是自己没有收集什么时候超时,什么时候能正常访问别人服务器的日志,搞网络 ...

  9. C#高级编程笔记之第三章:对象和类型

    类和结构的区别 类成员 匿名类型 结构 弱引用 部分类 Object类,其他类都从该类派生而来 扩展方法 3.2 类和结构 类与结构的区别是它们在内存中的存储方式.访问方式(类似存储在堆上的引用类型, ...

  10. linux监控系统的状态

    1.命令w的第一行和uptime或者用upload2.system load averages 表示单位时间短内活动的进程数3.查看cpu的个数和核数processor.physical id 4.v ...