【UOJ#129】 【NOI2015】寿司晚宴
题目描述
为了庆祝 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 取模)。注意一个人可以不吃任何寿司。
输入格式
输入文件的第 1 行包含 2 个正整数 n,p,中间用单个空格隔开,表示共有 n 种寿司,最终和谐的方案数要对 p 取模。
输出格式
输出一行包含 1 个整数,表示所求的方案模 p 的结果。
题解
注意到所有和谐的方案,两人的质数集合一定是不相交的。
对于所有大于根号的质数,不存在一个数同时包含两个这样的数。打个比方,假如n是100,那么我们在考虑17的时候,就不需要考虑11,13有没有取。而小于根号的质数就不具备有这个性质。所以对于大于根号的质数是一个分层的关系,层与层之间是无后效性的,所以我们可以分层来DP。
计f[i][A][B]表示在第i层里一个人集合为A,另一个人集合为B的方案。然后枚举子集、前缀和转移一下就好了。
代码
#include <cstdio>
#include <algorithm>
#include <cstring> #define R register
#define maxn 510
int pr[maxn], prcnt, mp[maxn], r[maxn];
int f[maxn][][][], g[maxn][][], tf[][][];
bool vis[maxn];
inline bool cmp(R int a, R int b)
{
return mp[a] < mp[b];
}
int main()
{
R int n, p; scanf("%d%d", &n, &p);
for (R int i = ; i <= n; ++i)
{
r[i] = i;
if (!vis[i]) pr[++prcnt] = mp[i] = i;
for (R int j = ; j <= prcnt && i * pr[j] <= n; ++j)
{
vis[i * pr[j]] = ;
mp[i * pr[j]] = mp[i];
if (i % pr[j] == ) break;
}
}
std::sort(r + , r + n + , cmp);
R int tot = ;
g[][][] = % p;
for (R int i = ; i <= n; ++i)
{
R int x = r[i], tS = ;
if (mp[x] < || mp[r[i]] != mp[r[i - ]]) ++tot;
// printf("%d %d %d %d\n", i, r[i], mp[r[i]], tot);
for (R int j = ; j <= prcnt && pr[j] < ; ++j)
if (x % pr[j] == ) tS |= << (j - ); memcpy(tf, f[tot], sizeof (tf));
for (R int A = ; A < ; ++A)
{
R int mB = ~A & ;
for (R int B = mB; B; B = (B - ) & mB)
if (!(B & tS))
(f[tot][A | tS][B][] += (g[tot - ][A][B] + tf[A][B][]) % p) %= p,
(f[tot][B][A | tS][] += (g[tot - ][B][A] + tf[B][A][]) % p) %= p;
(f[tot][A | tS][][] += (g[tot - ][A][] + tf[A][][]) % p) %= p;
(f[tot][][A | tS][] += (g[tot - ][][A] + tf[][A][]) % p) %= p;
} for (R int A = ; A < ; ++A)
{
R int mB = ~A & ;
for (R int B = mB; B; B = (B - ) & mB)
g[tot][A][B] = (g[tot - ][A][B] + (f[tot][A][B][] + f[tot][A][B][]) % p) % p;
g[tot][A][] = (g[tot - ][A][] + (f[tot][A][][] + f[tot][A][][]) % p) % p;
}
}
R int ans = ;
for (R int A = ; A < ; ++A)
{
R int mB = ~A & ;
for (R int B = mB; B; B = (B - ) & mB)
(ans += g[tot][A][B]) %= p;
(ans += g[tot][A][]) %= p;
}
printf("%d\n", ans);
return ;
}
【UOJ#129】 【NOI2015】寿司晚宴的更多相关文章
- [UOJ#129][BZOJ4197][Noi2015]寿司晚宴
[UOJ#129][BZOJ4197][Noi2015]寿司晚宴 试题描述 为了庆祝 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是给哪个 ...
- BZOJ_4197_[Noi2015]寿司晚宴_状态压缩动态规划
BZOJ_4197_[Noi2015]寿司晚宴_状态压缩动态规划 Description 为了庆祝 NOI 的成功开幕,主办方为大家准备了一场寿司晚宴.小 G 和小 W 作为参加 NOI 的选手,也被 ...
- [NOI2015]寿司晚宴 --- 状压DP
[NOI2015]寿司晚宴 题目描述 为了庆祝NOI的成功开幕,主办方为大家准备了一场寿司晚宴. 小G和小W作为参加NOI的选手,也被邀请参加了寿司晚宴. 在晚宴上,主办方为大家提供了n−1种不同的寿 ...
- 【BZOJ4197】[Noi2015]寿司晚宴 状压DP+分解质因数
[BZOJ4197][Noi2015]寿司晚宴 Description 为了庆祝 NOI 的成功开幕,主办方为大家准备了一场寿司晚宴.小 G 和小 W 作为参加 NOI 的选手,也被邀请参加了寿司晚宴 ...
- BZOJ 4197: [Noi2015]寿司晚宴 状态压缩 + 01背包
4197: [Noi2015]寿司晚宴 Time Limit: 10 Sec Memory Limit: 512 MB Description 为了庆祝 NOI 的成功开幕,主办方为大家准备了一场寿 ...
- BZO4197 & 洛谷2150 & UOJ129:[NOI2015]寿司晚宴——题解
https://www.lydsy.com/JudgeOnline/problem.php?id=4197 https://www.luogu.org/problemnew/show/P2150 ht ...
- NOI2015 寿司晚宴
今年NOI确实是在下输了.最近想把当时不会做的题都写一下. 题意 从2到n(500)这些数字中,选若干分给A,若干分给B,满足不存在:A的某个数和B的某个数的GCD不等于1. 对于寿司晚宴这题,标准解 ...
- bzoj 4199 [NOI2015]寿司晚宴
Description 为了庆祝 NOI 的成功开幕,主办方为大家准备了一场寿司晚宴.小 G 和小 W 作为参加 NOI 的选手,也被邀请参加了寿司晚宴. 在晚宴上,主办方为大家提供了 n−1 种不同 ...
随机推荐
- 像写SQL语句一样写Java代码
@Data @AllArgsConstructor public class Trader { private final String name; private final String city ...
- Codeforces 1228C. Primes and Multiplication
传送门 当然是考虑 $n$ 的每个质数 $p$ 对答案的贡献 考虑 $p^k$ 在 $[1,m]$ 中出现了几次,显然是 $\left \lfloor \frac{m}{p^k} \right \rf ...
- Scala新版本学习(2):
1.本章要点; (1)if表达式有值: (2)块也有值,是它最后一个表达式的值 (3)Scala的for循环就像是"增强版的"Java for循环 (4)分号不是必须的 (5)vo ...
- 前端框架:Angular React 和 Vue的比较
前端这几年的技术发展很快,细分下来,主要可以分成四个方面: 1.开发语言技术,主要是ES6&7,coffeescript,typescript等: 2.开发框架,如Angular,React, ...
- 第十七篇 JS验证form表单
JS验证form表单 这节课做一个实际的,项目里会遇到的东西,例如登录页面,我们输入‘用户名’和‘密码’或者‘手机号’还有‘验证码’等等,它都会做一个前端验证,比如验证码,是6位有效数字组成,那么 ...
- python异步IO编程(二)
python异步IO编程(二) 目录 开门见山 Async IO设计模式 事件循环 asyncio 中的其他顶层函数 开门见山 下面我们用两个简单的例子来让你对异步IO有所了解 import asyn ...
- 正确的安装和使用nvm(mac)<转>
前言 目前主流的node版本管理工具有两种,nvm和n.两者差异挺大的,具体分析可以参考一下淘宝FED团队的一篇文章: 管理 node 版本,选择 nvm 还是 n? 总的来说,nvm有点类似于 Py ...
- 关于select的取值
这篇博客,主要是记录我我所犯的错误,或者自己的写法不规范导致了错误,大家可以引以引以为鉴. 我要获取select当前的值,在IE9上我可以直接写document.getElementById(&quo ...
- docker快速入门02——在docker下开启mysql5.6 binlog日志
1.检查容器状态 [root@localhost ~]# docker ps 执行这个命令可以看到所有正在运行当中的容器,如果加上-a参数,就可以看到所有的容器包括停止的. 我们可以看到容器正在运行当 ...
- sftp及两种连接模式简介
sftp是ssh内含的协议,只要sshd服务器启动了,它就可用,它本身不需要ftp服务器启动. FTP服务器和客户端要进行文件传输,就需要通过端口来进行.FTP协议需要的端口一般包括两种: 控制链路- ...