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]寿司晚宴的更多相关文章

  1. BZOJ 4197 NOI 2015 寿司晚宴 状压DP

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

  2. BZOJ 4197 NOI 2015 寿司晚宴

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

  3. NOI 2015 寿司晚宴 (状压DP+分组背包)

    题目大意:两个人从2~n中随意取几个数(不取也算作一种方案),被一个人取过的数不能被另一个人再取.两个人合法的取法是,其中一个人取的任何数必须与另一个人取的每一个数都互质,求所有合法的方案数 (数据范 ...

  4. 【BZOJ-4197】寿司晚宴 状压DP

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

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

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

  6. BZOJ4197[NOI2005]寿司晚宴

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

  7. HYSBZ 4197 寿司晚宴

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

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

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

  9. NOI2015 寿司晚宴

    今年NOI确实是在下输了.最近想把当时不会做的题都写一下. 题意 从2到n(500)这些数字中,选若干分给A,若干分给B,满足不存在:A的某个数和B的某个数的GCD不等于1. 对于寿司晚宴这题,标准解 ...

随机推荐

  1. 设置 Nuget 本地源、在线私有源、自动构建打包

    设置 Nuget 本地源.在线私有源.自动构建打包 本文演示如果在项目中生成 Nuget 包,并添加 Nuget 本地源,不用发布到 Nuget 服务器.再附带使用在线私有源的简单方法,以及提交代码自 ...

  2. 动态执行 VB.NET 和 C# 代码

    有时候我们需要尝试动态地与一些代码进行交互,而不是只能执行程序内已编死的代码,那该怎么办呢?我首先推荐各种脚本语言,如Javascript.Lua.Python等等,这些脚本语言有很多优秀的第三方类库 ...

  3. [C#]Dapper学习笔记

    1.安装,直接用nuget搜索Dapper就行,不过只支持框架4.5.1 2.数据库测试表 CREATE TABLE [dbo].[Student]( [ID] [bigint] NULL, ) NU ...

  4. python做数据分析pandas库介绍之DataFrame基本操作

    怎样删除list中空字符? 最简单的方法:new_list = [ x for x in li if x != '' ] 这一部分主要学习pandas中基于前面两种数据结构的基本操作. 设有DataF ...

  5. ionic 2.x 3.x项目结构解析

    myApp │ config.xml //项目配置文件,包名.名称.minSdkVersion等都在此处配置 │ ionic.config.json │ package.json //项目依赖文件列表 ...

  6. nginx-2.nginx是什么

    Nginx是一款自由的.开源的.高性能的HTTP服务器和反向代理服务器:同时也是一个IMAP.POP3.SMTP代理服务器: Nginx可以作为一个HTTP服务器进行网站的发布处理,另外Nginx可以 ...

  7. webpack安装整理

    早上有点时间大概安装一下webpack,操作一下顺便把步骤记一下,乱乱的,还是记录一下吧! webpack安装步骤:1. 2. 3.一直回车,出现如下图: 4.创建src和dist文件 5.需要在np ...

  8. falcon适配ldap密码同步

    问题 小米的openfalcon在使用ldap首次登陆成功后,会在本地创建同名的账号, 这就有个问题当你更新了ldap的密码时,openfalcon是没有同步本地账号密码的功能 二次改造 方便我们de ...

  9. ajaxsubmit 上传文件 在IE中返回的内容 提示下载文件

    在ajaxSubmit提交表单的时候,如果表单内有文件上传的话,会判断参数是否配置的iframe为false参数,如果没有,会用创建隐藏iframe方式提交表单,如果设定了iframe为false,则 ...

  10. MATLAB下数组随机打乱顺序的方法

    一:问题 有两个规模相同的数组,两个数组相同位置的元素一一对应,现在要将两数组的元素同时打乱顺序,并且乱序后的两数组对应位置元素要保持乱序前的对应关系. 二:方法  采用randperm()函数,产生 ...