BZOJ 4197: [Noi2015]寿司晚宴 状态压缩 + 01背包
4197: [Noi2015]寿司晚宴
Time Limit: 10 Sec Memory Limit: 512 MB
Description
为了庆祝 NOI 的成功开幕,主办方为大家准备了一场寿司晚宴。小 G 和小 W 作为参加 NOI 的选手,也被邀请参加了寿司晚宴。
Input
输入文件的第 1 行包含 2 个正整数 n,p,中间用单个空格隔开,表示共有 n 种寿司,最终和谐的方案数要对 p 取模。
Output
输出一行包含 1 个整数,表示所求的方案模 p 的结果。
Sample Input
Sample Output
HINT
2≤n≤500
题解:
前8个质因子,状压
这n<=500的数都最多包含一个大于根号n的质因子
跑01背包
#include<bits/stdc++.h>
using namespace std;
#define ls i<<1
#define rs ls | 1
#define mid ((ll+rr)>>1)
#define pii pair<int,int>
#define MP make_pair
typedef long long LL;
typedef unsigned long long ULL;
const long long INF = 1e18+1LL;
const double pi = acos(-1.0);
const int N=+,M=1e6+,inf=; int p[] = {,,,,,,,};
int dp[][(<<)+][(<<)+],pd[][(<<)+][(<<)+],n,P,f[N],has[(<<)+][(<<)+];
vector<int > fi,se[N];
int main() {
scanf("%d%d",&n,&P);
for(int i = ; i <= n; ++i) {
int tmp = i,now = ;
for(int j = ; j < ; ++j)
while(tmp%p[j] == ) now|=(<<j),tmp/=p[j];
if(tmp == )
f[i] = now,fi.push_back(i);
else
f[i] = now,se[tmp].push_back(i);
}
int now = ;
dp[][][] = ;
for(int g = ; g < fi.size(); ++g) {
int u = fi[g];
now ^= ;
memset(dp[now],,sizeof(dp[now]));
for(int i = ; i < (<<); ++i)
for(int j = ; j < (<<); ++j) {
if((j&f[u])==) dp[now][i|f[u]][j] += dp[now^][i][j]%P,dp[now][i|f[u]][j]%=P;
if((i&f[u])==) dp[now][i][j|f[u]] += dp[now^][i][j]%P,dp[now][i][j|f[u]]%=P;
dp[now][i][j] += dp[now^][i][j]%P,dp[now][i][j]%=P;
}
}
for(int S = ; S <= n; ++S) {
if(se[S].size() == ) continue;
int tmp = now;
for(int i = ; i < (<<); ++i)
for(int j = ; j < (<<); ++j) has[i][j] = pd[tmp][i][j] = dp[now][i][j]; for(int g = ; g < se[S].size(); ++g) {
now ^= ;
memset(dp[now],,sizeof(dp[now]));
for(int i = ; i < (<<); ++i)
for(int j = ; j < (<<); ++j) {
int u = se[S][g];
if((i&f[u])==) dp[now][i][j|f[u]] += dp[now^][i][j]%P,dp[now][i][j|f[u]]%=P;
dp[now][i][j] += dp[now^][i][j]%P,dp[now][i][j]%=P;
}
}
for(int g = ; g < se[S].size(); ++g) {
tmp ^= ;
memset(pd[tmp],,sizeof(pd[tmp]));
for(int i = ; i < (<<); ++i)
for(int j = ; j < (<<); ++j) {
int u = se[S][g];
if((j&f[u])==) pd[tmp][i|f[u]][j] += pd[tmp^][i][j]%P,pd[tmp][i|f[u]][j]%=P;
pd[tmp][i][j] += pd[tmp^][i][j]%P,pd[tmp][i][j]%=P;
}
}
for(int i = ; i < (<<); ++i)
for(int j = ; j < (<<); ++j) dp[now][i][j] += ((pd[tmp][i][j] - has[i][j])%P+P)%P,dp[now][i][j] %= P;
}
int ans = ;
for(int i = ; i < (<<); ++i)
for(int j = ; j < (<<); ++j) if((i&j) == )ans += dp[now][i][j],ans %= P;
printf("%d\n",ans);
return ;
}
BZOJ 4197: [Noi2015]寿司晚宴 状态压缩 + 01背包的更多相关文章
- BZOJ 4197: [Noi2015]寿司晚宴( dp )
N^0.5以内的质数只有8个, dp(i, j, k)表示用了前i个大质数(>N^0.5), 2人选的质数(<=N^0.5)集合分别为j, k时的方案数. 转移时考虑当前的大质数p是给哪个 ...
- [BZOJ]4197: [Noi2015]寿司晚宴
Time Limit: 10 Sec Memory Limit: 512 MB Description 为了庆祝 NOI 的成功开幕,主办方为大家准备了一场寿司晚宴.小 G 和小 W 作为参加 NO ...
- BZOJ 4197: [Noi2015]寿司晚宴 状压dp+质因数分解
挺神的一道题 ~ 由于两个人选的数字不能有互质的情况,所以说对于一个质因子来说,如果 1 选了,则 2 不能选任何整除该质因子的数. 然后,我们发现对于 1 ~ 500 的数字来说,只可能有一个大于 ...
- bzoj 4197: [Noi2015]寿司晚宴【状压dp】
一个数内可能多个的质因数只有小于根号n的,500内这样的数只有8个,所以考虑状压 把2~n的数处理出小于根号500的质因数集压成s,以及大质数p(没有就是1),然后按p排序 根据题目要求,拥有一个质因 ...
- bzoj 4199 [NOI2015]寿司晚宴
Description 为了庆祝 NOI 的成功开幕,主办方为大家准备了一场寿司晚宴.小 G 和小 W 作为参加 NOI 的选手,也被邀请参加了寿司晚宴. 在晚宴上,主办方为大家提供了 n−1 种不同 ...
- 4197: [Noi2015]寿司晚宴
状压dp. 500分解质因数的话,除了最大的质因数只需要8个质数,用二进制x储存,最大的质因数用y来储存(若没有比那8个质数大的质因数就使y=1) 用f[i][j]表示第一个人方案为i,第二个人方案为 ...
- Relocation - POJ 2923(状态压缩+01背包)
题目大意:有个人需要搬家,有N件物品,给个物品的重量是 w[i] 然后又两个车,每个车的载重量分别是C1和C2,求最少需要运输多少次才能把这些物品全部运输完毕. 分析:刚开始就发现物品数不多,想着直接 ...
- [BZOJ4197][Noi2015]寿司晚宴
4197: [Noi2015]寿司晚宴 Time Limit: 10 Sec Memory Limit: 512 MBSubmit: 412 Solved: 279[Submit][Status] ...
- BZOJ_4197_[Noi2015]寿司晚宴_状态压缩动态规划
BZOJ_4197_[Noi2015]寿司晚宴_状态压缩动态规划 Description 为了庆祝 NOI 的成功开幕,主办方为大家准备了一场寿司晚宴.小 G 和小 W 作为参加 NOI 的选手,也被 ...
随机推荐
- IndiaHacks 2nd Elimination 2017 (unofficial, unrated mirror, ICPC rules)
D. Airplane Arrangements time limit per test 2 seconds memory limit per test 256 megabytes input sta ...
- .NET重构(八):周结账单中,给报表添加参数
导读:进行完了日结报表的制作,大松一口气.不过,刚开始看着周结账单中的两个参数问题,也是愁了很久.不过,只要思想不滑坡,办法总比困难多.接下来,就写写我制作周结账单报表的过程. 一.添加参数 1,在日 ...
- 30分钟学会如何使用Shiro(转自:http://www.cnblogs.com/learnhow/p/5694876.html)
本篇内容大多总结自张开涛的<跟我学Shiro>原文地址:http://jinnianshilongnian.iteye.com/blog/2018936 我并没有全部看完,只是选择了一部分 ...
- oracle create directory
1.新建directory的语法 CREATE [OR REPLACE] DIRECTORY directory AS 'pathname'; 例如: create or replace direct ...
- HackerRank# Bricks Game
原题地址 DP很简单,懒得压缩空间了,反正都能过 #include <cmath> #include <cstdio> #include <vector> #inc ...
- Codeforces Round #278 (Div. 2) B. Candy Boxes [brute force+constructive algorithms]
哎,最近弱爆了,,,不过这题还是不错滴~~ 要考虑完整各种情况 8795058 2014-11-22 06:52:58 njczy2010 B - Ca ...
- ZOJ 3811 / 2014 牡丹江赛区网络赛 C. Untrusted Patrol bfs/dfs/并查集
Untrusted Patrol Time Limit: 3 Seconds Memory Limit: 65536 KB ...
- 关于代码调试de那些事
原文出处:http://www.wklken.me/posts/2014/11/23/how-to-debug.html 关于代码调试de那些事 1.你得明白你在做什么, 保持清醒 2.想清楚了再写代 ...
- ci框架——文章查看之上篇下篇
1:从数据库查询出推荐的文章的信息,循环查出每篇推荐文章的id和title; foreach($data as $val){ $dataid[]=$val->aid; $datatitle[]= ...
- php——两种无限级分类
/** * 无级递归分类 TP框架 * @param int $assortPid 要查询分类的父级id * @param mixed $tag 上下级分类之间的分隔符 * @return strin ...