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. Poj2296

    题意:给定n个点,然后在每个点在一个正方形的上边或者下边的中点,并且所有的正方形等大且不能重叠.求正方形最大的边长是多少. 思路:很明显的二分边长+判定.不过判定要用到2-sat,算是2-sat的入门 ...

  2. 用C#中的键值对遍历数组或字符串元素的次数

    代码如下: string strs = "ad6la4ss42d6s3"; Dictionary<char, int> dic = new Dictionary< ...

  3. C#中类的属性的获取

    /// <summary> /// 将多个实体转换成一个DataTable /// </summary> /// <typeparam name="T" ...

  4. Unity 环境区域网格化

    在使用A星算法和物体布局的过程中,常常会使用的网格的概念,即建立在网格的基础上,会使得游戏的相关编程变得简单的多. 格子的代码: using System.Collections; using Sys ...

  5. 【ElasticSearch】:索引Index、文档Document、字段Field

    因为从ElasticSearch6.X开始,官方准备废弃Type了.对应数据库,对ElasticSearch的理解如下: ElasticSearch 索引Index 文档Document 字段Fiel ...

  6. CSS中text-shadow的几个好看的文字demo及其代码

    最近有看到一些镂空的或者立体的文字设计图非常好看,然后想了想,应该是使用text-shadow来实现的,这里我贴出我仿的八个demo,分享给大家 首先是HTML代码 <div class=&qu ...

  7. SQL 复习笔记 MSSQL篇

    苦逼得很,一下就失业了,只有好好复习,迎接下一份工作 MSSQL篇:     1.数据库表分为临时表和永久表.临时表又分为全局临时表和局部临时表         全局临时表:表名以##开头.对系统当前 ...

  8. 【liferay】4、liferay的权限体系

    liferay中有几个概念 1.user_ 表存放liferay的用户 2.usergroup 用户组 3.角色 4.组织,组织可以是站点的成员 5.站点 6.团队 liferay中所有的东西都被视为 ...

  9. C# 发送HTTP请求超时解决办法

    request.GetResponse();超时问题的解决,和HttpWebRequest多线程性能问题,请求超时的错误, 解决办法 1.将http的request的keepAlive设置为false ...

  10. oracle数据库迁移相关

    常见的实现方式: rman exp/imp  expdp/impdp DG OGG 主要是看停机时间了,方法很多,数据量小,就导出,如果时间要求很高,那可以采取dg或ogg或类似的技术.减低downt ...