[NOI 2015]寿司晚宴
Description
给定 \(2\sim n\) 一共 \(n-1\) 个数字,第一个人选择一些数字,第二个人选择一些数字,要求第一个人选的任意一个数字和第二个人选择的任意一个数字都互质,求方案数。
\(2\leq n\leq 500\)
Solution
做的时候想偏了...正解做法比较神...
我们考虑对一个数质因数分解,容易发现对于 \(\geq \sqrt{500}\) 的质因数一定最多一个。
我们可以拿 \(\geq \sqrt{500}\) 的质因数为依据分组。对于 \(\leq \sqrt{500}\) 的质因数一共只有 \(8\) 个,我们拿来状压。
如果一个数没有 \(\geq \sqrt{500}\) 的质因数,那么它单独成一组。
显然的是同一组的数不能同一个人拿,因为同一组共同拥有一个 \(\geq \sqrt{500}\) 的质因数(或没有)。
所以我们可以按组来做。
记 \(f_{i,j}\) 表示第一个人选 \(\leq \sqrt{500}\) 的质因数的状态为 \(i\) ,第二个人为 \(j\) 的方案数,显然 \(i\cap j=0\) 。
那么考虑组内 \(\text{DP}\) 。记 \(f_{0/1,i,j}\) 表示第一/二个人选这一组(或是不选)第一个人选 \(\leq \sqrt{500}\) 的质因数的状态为 \(i\) ,第二个人为 \(j\) 的方案数。
首先先将 \(f\) 分别拷一份给 \(g_{0},g_{1}\) 。
组内 \(\text{DP}\) 后再将 \(f'=g_{0}+g_{1}-f\) ,因为都不选的方案算了两次。
最后统计答案即可。
Code
#include <bits/stdc++.h>
#define ll long long
#define pii pair<int, int>
using namespace std;
const int prime[8] = {2, 3, 5, 7, 11, 13, 17, 19};
const int N = 505, SZ = (1<<8)+5;
int n, bin[10];
ll p, f[SZ][SZ], g[2][SZ][SZ];
pii a[N];
void work() {
scanf("%d%lld", &n, &p);
bin[0] = 1;
for (int i = 1; i <= 8; i++) bin[i] = (bin[i-1]<<1);
for (int i = 2; i <= n; i++) {
int x = i;
for (int j = 0; j < 8; j++) {
if (x%prime[j] == 0) a[i].second |= bin[j];
while (x%prime[j] == 0) x /= prime[j];
}
a[i].first = x;
}
sort(a+2, a+n+1); f[0][0] = 1;
for (int i = 2; i <= n; i++) {
if (a[i].first == 1 || a[i].first != a[i-1].first)
memcpy(g[0], f, sizeof(g[0])), memcpy(g[1], f, sizeof(g[1]));
for (int j = bin[8]-1; ~j; j--)
for (int k = bin[8]-1; ~k; k--) {
if ((a[i].second&k) == 0)
(g[0][j|a[i].second][k] += g[0][j][k]) %= p;
if ((a[i].second&j) == 0)
(g[1][j][k|a[i].second] += g[1][j][k]) %= p;
}
if (a[i].first == 1 || a[i].first != a[i+1].first) {
for (int j = 0; j < bin[8]; j++)
for (int k = 0; k < bin[8]; k++)
f[j][k] = (g[0][j][k]+g[1][j][k]-f[j][k])%p;
}
}
ll ans = 0;
for (int j = 0; j < bin[8]; j++)
for (int k = 0; k < bin[8]; k++)
(ans += f[j][k]) %= p;
printf("%lld\n", (ans+p)%p);
}
int main() {work(); return 0; }
[NOI 2015]寿司晚宴的更多相关文章
- BZOJ 4197 NOI 2015 寿司晚宴 状压DP
4197: [Noi2015]寿司晚宴 Time Limit: 10 Sec Memory Limit: 512 MBSubmit: 694 Solved: 440[Submit][Status] ...
- BZOJ 4197 NOI 2015 寿司晚宴
题面 Description 为了庆祝 NOI 的成功开幕,主办方为大家准备了一场寿司晚宴.小 G 和小 W 作为参加 NOI 的选手,也被邀请参加了寿司晚宴. 在晚宴上,主办方为大家提供了 n−1 ...
- NOI 2015 寿司晚宴 (状压DP+分组背包)
题目大意:两个人从2~n中随意取几个数(不取也算作一种方案),被一个人取过的数不能被另一个人再取.两个人合法的取法是,其中一个人取的任何数必须与另一个人取的每一个数都互质,求所有合法的方案数 (数据范 ...
- 【BZOJ-4197】寿司晚宴 状压DP
4197: [Noi2015]寿司晚宴 Time Limit: 10 Sec Memory Limit: 512 MBSubmit: 694 Solved: 440[Submit][Status] ...
- [BZOJ4197][Noi2015]寿司晚宴
4197: [Noi2015]寿司晚宴 Time Limit: 10 Sec Memory Limit: 512 MBSubmit: 412 Solved: 279[Submit][Status] ...
- BZOJ4197[NOI2005]寿司晚宴
Description 为了庆祝 NOI 的成功开幕,主办方为大家准备了一场寿司晚宴.小 G 和小 W 作为参加 NOI 的选手,也被邀请参加了寿司晚宴. 在晚宴上,主办方为大家提供了 n−1 种不同 ...
- HYSBZ 4197 寿司晚宴
Description 为了庆祝 NOI 的成功开幕,主办方为大家准备了一场寿司晚宴.小 G 和小 W 作为参加 NOI 的选手,也被邀请参加了寿司晚宴. 在晚宴上,主办方为大家提供了 n−1 种不同 ...
- BZOJ 4197: [Noi2015]寿司晚宴( dp )
N^0.5以内的质数只有8个, dp(i, j, k)表示用了前i个大质数(>N^0.5), 2人选的质数(<=N^0.5)集合分别为j, k时的方案数. 转移时考虑当前的大质数p是给哪个 ...
- NOI2015 寿司晚宴
今年NOI确实是在下输了.最近想把当时不会做的题都写一下. 题意 从2到n(500)这些数字中,选若干分给A,若干分给B,满足不存在:A的某个数和B的某个数的GCD不等于1. 对于寿司晚宴这题,标准解 ...
随机推荐
- CSS 基础 例子 图片拼合技术
利用background-position xpos ypos 就是以图片的左上角顶点为原点,往下和右都为正,反之为负,移动图片 如: background-position: 15px 20px;( ...
- JMS 消息队列
1.jms broker服务器:Broker:消息队列核心,相当于一个控制中心,负责路由消息.保存订阅和连接.消息确认和控制事务
- Page_Load是怎样被执行的
关于Asp.Net的生命周期的文章,很多很多,不管是管道生命周期,还是页面生命周期,图文并茂的文章并不少,我就不说了,我只是在复习这些知识点的时候,想具体知道一个页面的Page_Load方法到底是怎么 ...
- [实战演练]蜻蜓FM2014年校招笔试题目 - 规则二叉树
题目:某规则二叉树的定义是:对于树中任意两个叶结点A.B,他们与根结点的距离分别是d1和d2,|d1-d2|<=1.请写出函数 bool isRuledTree(Node *root)的代码实现 ...
- Linux之IRQ domain
概述 Linux使用IRQ domain来描述一个中断控制器(IRQ Controller)所管理的中断源.换句话说,每个中断控制器都有自己的domain.我们可以将IRQ Domain看作是IRQ ...
- adb shell pm list packages的用法
abd shell pm list packages ####查看当前连接设备或者虚拟机的所有包 adb shell pm list packages -d #####只输出禁用的包. ...
- iOS-项目开发1-Block
Block回顾 Block分为NSStackBlock, NSMallocBlock, NSGloblaBlock.即栈区Block,堆区Block,全局Block.在ARC常见的是堆块. 在ARC中 ...
- CodeForces - 940C + CodeForces - 932B (两道比较好的模拟题)
940C链接:http://codeforces.com/problemset/problem/940/C C. Phone Numbers time limit per test 2 seconds ...
- Freemarker实例教程
原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本人声明.否则将追究法律责任.作者:永恒の_☆ 地址:http://blog.csdn.net/chenghui0317/a ...
- Spring Boot中使用Redis数据库
引入依赖 Spring Boot提供的数据访问框架Spring Data Redis基于Jedis.可以通过引入spring-boot-starter-redis来配置依赖关系. <depend ...