[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. 对于寿司晚宴这题,标准解 ...
随机推荐
- int与String互转
1.把String转化为int类型 Integer.valueOf(i); 2.把int转化为String 1)String.valueOf(i) 2)Integer.toString(i) 3)i+ ...
- ubuntu 修改mysql 5.7数据库密码
1.vi /ect/mysql/debian 查看debain-sys-maint用户的密码 2.登录mysql 4.切换到mysql数据库,更新 user 表: update user set au ...
- 11i - 12 Gather Schema Statistics fails with Ora-20001 errors after 11G database Upgrade (文档 ID 781813.1)
11i - 12 Gather Schema Statistics fails with Ora-20001 errors after 11G database Upgrade (文档 ID 7818 ...
- Android-Java-synchronized静态方法&字节码文件对象
上一篇博客 Android-Java-同步方法-synchronized,中讲解了普通方法加入synchronized修饰符,此synchronized的同步锁是this,还介绍方法的封装性,这篇博客 ...
- hdu 1.2.4
采用异或... #include<stdio.h> int main() { //freopen("input.txt","r",stdin); i ...
- Ubuntu下mount命令的好用处
mount,也就是挂载.如果是让电脑自己挂载Windows的分区,也就是你直接在文件管理器里点击那些Windows的盘符,系统就会帮助你自动挂载,不过其挂载后的名称太长太复杂,不方便终端操作.所以还是 ...
- 用一个应用场景理解ASP.NET Core Identity是什么?
目录 前言 基于声明的认证(Claims-based Authentication) 应用场景一 在ASP.NET Core 中Identity是如何实现的 类ClaimsPrincipal 考察另外 ...
- .NET MVC 学习笔记(七)— 控制input控件
.NET MVC 学习笔记(七)— 控制input控件 画面中有时候需要输入数字,这时就需要控制input的输入.以下为保留两位有效数字. /* * 初始化数字输入 */ function initD ...
- jQuery的addClass,removeClass和toggleClass方法
jQuery的addClass,removeClass和toggleClass方法,最后一个方法在某一情形之下,可以替代前面2个方法. 第一个方法addClass为元素添加一个class. 第二个方法 ...
- 【转】OAuth2.0的refresh token
转载自http://www.html-js.com/?p=1297 最近看人人网的OAuth认证,发现他是OAuth2.0,之前一直看的是新浪的OAuth,是OAuth1.0. 二者还是有很多不同的, ...