BZOJ_4197_[Noi2015]寿司晚宴_状态压缩动态规划
BZOJ_4197_[Noi2015]寿司晚宴_状态压缩动态规划
Description
为了庆祝 NOI 的成功开幕,主办方为大家准备了一场寿司晚宴。小 G 和小 W 作为参加 NOI 的选手,也被邀请参加了寿司晚宴。
Input
输入文件的第 1 行包含 2 个正整数 n,p,中间用单个空格隔开,表示共有 n 种寿司,最终和谐的方案数要对 p 取模。
Output
输出一行包含 1 个整数,表示所求的方案模 p 的结果。
Sample Input
Sample Output
HINT
2≤n≤500
$g[i][j]$表示第一个人不选这个大质数的方案数,$h[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]寿司晚宴_状态压缩动态规划的更多相关文章
- BZOJ 4197: [Noi2015]寿司晚宴 状态压缩 + 01背包
4197: [Noi2015]寿司晚宴 Time Limit: 10 Sec Memory Limit: 512 MB Description 为了庆祝 NOI 的成功开幕,主办方为大家准备了一场寿 ...
- [NOI2015]寿司晚宴 --- 状压DP
[NOI2015]寿司晚宴 题目描述 为了庆祝NOI的成功开幕,主办方为大家准备了一场寿司晚宴. 小G和小W作为参加NOI的选手,也被邀请参加了寿司晚宴. 在晚宴上,主办方为大家提供了n−1种不同的寿 ...
- 【BZOJ4197】[Noi2015]寿司晚宴 状压DP+分解质因数
[BZOJ4197][Noi2015]寿司晚宴 Description 为了庆祝 NOI 的成功开幕,主办方为大家准备了一场寿司晚宴.小 G 和小 W 作为参加 NOI 的选手,也被邀请参加了寿司晚宴 ...
- [BZOJ4197][Noi2015]寿司晚宴
4197: [Noi2015]寿司晚宴 Time Limit: 10 Sec Memory Limit: 512 MBSubmit: 412 Solved: 279[Submit][Status] ...
- BZOJ 4197: [Noi2015]寿司晚宴( dp )
N^0.5以内的质数只有8个, dp(i, j, k)表示用了前i个大质数(>N^0.5), 2人选的质数(<=N^0.5)集合分别为j, k时的方案数. 转移时考虑当前的大质数p是给哪个 ...
- 状态压缩动态规划 状压DP
总述 状态压缩动态规划,就是我们俗称的状压DP,是利用计算机二进制的性质来描述状态的一种DP方式 很多棋盘问题都运用到了状压,同时,状压也很经常和BFS及DP连用,例题里会给出介绍 有了状态,DP就比 ...
- [UOJ#129][BZOJ4197][Noi2015]寿司晚宴
[UOJ#129][BZOJ4197][Noi2015]寿司晚宴 试题描述 为了庆祝 NOI 的成功开幕,主办方为大家准备了一场寿司晚宴.小 G 和小 W 作为参加 NOI 的选手,也被邀请参加了寿司 ...
- 【bzoj4197】[Noi2015]寿司晚宴 分解质因数+状态压缩dp
题目描述 为了庆祝 NOI 的成功开幕,主办方为大家准备了一场寿司晚宴.小 G 和小 W 作为参加 NOI 的选手,也被邀请参加了寿司晚宴. 在晚宴上,主办方为大家提供了 n−1 种不同的寿司,编号 ...
- NOI2015 寿司晚宴
今年NOI确实是在下输了.最近想把当时不会做的题都写一下. 题意 从2到n(500)这些数字中,选若干分给A,若干分给B,满足不存在:A的某个数和B的某个数的GCD不等于1. 对于寿司晚宴这题,标准解 ...
随机推荐
- MyBatis 框架之快速入门程序
一.使用 IDEA 快速创建 Maven 项目 关于如何快速创建 Maven 项目,这个可以参考下面这篇文章: Maven 项目管理工具基础入门系列(一) 二.快速配置 MyBatis 依赖 jar ...
- 企业级web负载均衡完美架构
转载:揭秘企业级web负载均衡完美架构(图) 2010-07-06 15:16 抚琴煮酒 51CTO.com 字号:T | T 相信很多朋友对企业级的负载均衡高可用实例非常感兴趣,此篇文章根据成熟的线 ...
- 解决XMind运行卡顿
问题 XMind是一款很好用的脑图工具,它是基于eclipse开发的,而且基础功能是免费的.最近我安装了XMind 8 Pro,但是发现在Mac上运行有卡顿. 解决方式 解决这个问题的思路也很简单,软 ...
- SQL解决"双重职位的查询"
双重身份问题: create table role_tab ( person char(5) not null, role char(1) not null ) insert into role_t ...
- 如何用Go语言实现汉诺塔算法
package main import ( "fmt" ) func print(n int,x rune,y rune)(){ fmt.Printf("moving d ...
- 前端Mahsup异步依赖方式不能做业务数据依赖
很久之前流行mashup方式做内容集成,之前为了IP定位的方便,引用了第三方的IP定位JS,然后根据其内容与服务器同步地址数据并写入Cookie,可是这种方式一旦,第三方的库反应缓慢时,就会出现大问题 ...
- python3学习笔记2---引用http://python3-cookbook.readthedocs.io/zh_CN/latest/2
2018-03-01数据结构和算法(2) 1.6字典中的键映射多个值 一个字典就是一个键对应一个单值的映射.如果你想要一个键映射多个值,那么你就需要将这多个值放到另外的容器中, 比如列表或者集合里面. ...
- JSF基础
JSF基础 1)JSF(JavaServer Faces)一种基于Java的Web应用的用户界面软件框架. 旨在降低web应用开发难度.减轻开发人员编写和维护web应用的负担. 一个基于JSF框架构建 ...
- 凸包问题——Graham Scan
Graham Scan 概述: 对于凸多边形的定义不在这里做详细叙述,这里给出算法的实现原理. Step 1: 找出x值最小的点的集合,从其中找出y值最小的点作为初始点 Step 2: 获得新序列后, ...
- httpClient连接超时设置
注: 每个HttpClinet对象设置都不一样 这里已3.x和4.x为例说明 1)3.X版本 创建连接 HttpClient httpClient=new DefaultHttpClient(); 这 ...