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. Relay Race (DP)

    Furik and Rubik take part in a relay race. The race will be set up on a large square with the side o ...

  2. HDU1007 TLE代码和AC代码对比

    这题卡了一天,上午开始看算法导论,然后实现了,一开始是wa,后来TLE,由于我开始的实现方式比较笨,而且在递归调用的时候很是混乱,用了好多数组.导致我的代码不断的出问题.具体是算法导论33-4. 后来 ...

  3. 【JQ同胞遍历】

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  4. 栅格网络流(cogs 750)

    [问题描述] Bob 觉得一般图的最大流问题太难了,他不知道如何解决,于是他想尝试一个简单点的:栅格网络中的最大流问题,这个虽说简单了一点,但对 Bob 来说依旧太难,现在他有个麻烦需要你帮忙:给你一 ...

  5. Dynamic Rankings(zoj 2112)

    题意:带修改的第K大 #include<cstdio> #include<iostream> #include<cstring> #define N 400010 ...

  6. ElasticSearch API 之 GET

    GET API是Elasticsearch中常用的操作,一般用于验证文档是否存在:或者执行CURD中的文档查询.与检索不同的是,GET查询是实时查询,可以实时查询到索引结果.而检索则是需要经过处理才能 ...

  7. 1109 NOIP 模拟考试

    NOIP2016 模拟赛 ——那些年,我们学过的文化课 背单词(word.c/cpp/pas)[题目描述]fqk 退役后开始补习文化课啦, 于是他打开了英语必修一开始背单词. 看着满篇的单词非常头疼, ...

  8. JavaScript 数组操作函数--转载+格式整理

    JavaScript 数组操作函数(部分)--转载+格式整理 今天看了一篇文章,主要讲的对常用的Js操作函数:push,pop,join,shift,unshift,slice,splice,conc ...

  9. 记住密码后,密码框Password会自动带出数据

    一般登陆之后浏览器会询问是否记住密码,如果把密码记住在浏览器上,下次登陆的时候浏览器会把用户名和密码自动填充到登录页面.前段时间服务站平台的员工账号模块提测后,测试提出360浏览器记住密码后会自用把登 ...

  10. Centos7安装遇到的问题及详解

    1.虚拟机中选择的是NAT模式,我的笔记本电脑是拨号上网,用桥接模式,找不到网卡,在windows的dos界面用ipconfig查看的结果 PPP适配器 宽带连接:IPv4 地址 . . . . . ...