4197: [Noi2015]寿司晚宴

Time Limit: 10 Sec  Memory Limit: 512 MB

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

题解:

  前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背包的更多相关文章

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

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

  2. [BZOJ]4197: [Noi2015]寿司晚宴

    Time Limit: 10 Sec  Memory Limit: 512 MB Description 为了庆祝 NOI 的成功开幕,主办方为大家准备了一场寿司晚宴.小 G 和小 W 作为参加 NO ...

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

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

  4. bzoj 4197: [Noi2015]寿司晚宴【状压dp】

    一个数内可能多个的质因数只有小于根号n的,500内这样的数只有8个,所以考虑状压 把2~n的数处理出小于根号500的质因数集压成s,以及大质数p(没有就是1),然后按p排序 根据题目要求,拥有一个质因 ...

  5. bzoj 4199 [NOI2015]寿司晚宴

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

  6. 4197: [Noi2015]寿司晚宴

    状压dp. 500分解质因数的话,除了最大的质因数只需要8个质数,用二进制x储存,最大的质因数用y来储存(若没有比那8个质数大的质因数就使y=1) 用f[i][j]表示第一个人方案为i,第二个人方案为 ...

  7. Relocation - POJ 2923(状态压缩+01背包)

    题目大意:有个人需要搬家,有N件物品,给个物品的重量是 w[i] 然后又两个车,每个车的载重量分别是C1和C2,求最少需要运输多少次才能把这些物品全部运输完毕. 分析:刚开始就发现物品数不多,想着直接 ...

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

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

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

    BZOJ_4197_[Noi2015]寿司晚宴_状态压缩动态规划 Description 为了庆祝 NOI 的成功开幕,主办方为大家准备了一场寿司晚宴.小 G 和小 W 作为参加 NOI 的选手,也被 ...

随机推荐

  1. ER模型图工具:PowerDesigner

    导读:开始是想一个阶段一个阶段的写文档,再写了可行性分析报告之后,发现这种方法整体性不强,写出来的文档也总是有考虑不周的地方.后来,就看完了全部的软工视频再写.现在该写项目开发总结报告了.在写文档的过 ...

  2. Error Domain=AVFoundationErrorDomain Code=-11800 "这项操作无法完成"

    在iOS上开发视频操作的时候,出现错误: 录制视频错误:Error Domain=AVFoundationErrorDomain Code=-11800 "这项操作无法完成" Us ...

  3. 【Luogu】P1072Hankson的趣味题(gcd)

    这题真TM的趣味. 可以说我的动手能力还是不行,想到了算法却写不出来.以后说自己数论会GCD的时候只好虚了…… 我们首先这么想. x与a0的最大公约数为a1,那么我们把x/=a1,a0/=a1之后,x ...

  4. BZOJ 1419 Red is good ——期望DP

    定义f[i][j]表示还剩i张红牌,j张黑牌的时候能取得的期望最大值 显然有$f[i][j]=max(0,\frac {i}{i+j}(f[i-1][j]+1)+ \frac {j}{i+j}(f[i ...

  5. 刷题总结——宠物收养所(bzoj1208)

    题目: Description 最近,阿Q开了一间宠物收养所.收养所提供两种服务:收养被主人遗弃的宠物和让新的主人领养这些宠物.每个领养者都希望领养到自己满意的宠物,阿Q根据领养者的要求通过他自己发明 ...

  6. unity的List构造函数在IOS平台存在缺陷

    当迩使用一个int[]或者string[]类似的数组时,以数组来初始化List对象,有可能在IOS平台上会出现初始化对象为空,比如 , }; List<int> listTest = ne ...

  7. ShareSDK中微信分享错误总结

    项目中用到微信分享,可向好友或朋友圈分享链接时,分享人可以打开网站,查看消息者却始终不能打开网站.试了N种方法,重写了N次分享模块,均没办法解决. 在无意中查看分享链接时发现,朋友圈里分享后,原始链接 ...

  8. BZOJ——1571: [Usaco2009 Open]滑雪课Ski

    http://www.lydsy.com/JudgeOnline/problem.php?id=1571 Time Limit: 10 Sec  Memory Limit: 64 MBSubmit:  ...

  9. 洛谷——P2074 危险区域

    P2074 危险区域 题目背景 一个恐怖组织在一座城市中安放了定时炸弹,其威力巨大,现在这里的警长想知道最坏的情况下会有多少街区受威胁. 题目描述 在一个城市有N*M个街区,每个街区由坐标描述,如图所 ...

  10. 关于SIP一些总结

    SIP(session Initiation protocol)会话初始协议,是应用层信令控制协议,主要应用于创建.修改.释放多媒体会话. 一般而言,SIP只负责不同UE之间的协商与通信,比如媒体能力 ...