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. AngularJS 承诺 Promise

    一.概念解释 全称是未来与承诺,Futures and promises,是一种编程模式,不是AngularJS首创.javascript里有个流行库Q,而AngularJS是$q,其就是从Q引入的: ...

  2. CSS 基础 例子 伪元素和伪类 & 区别

    一.概念 CSS 伪类 -------向某些选择器添加特殊的效果,要达到同等效果,通过类来达到效果 CSS 伪元素     -------将特殊的效果添加到某些选择器,要达到同等效果,通过添加元素达到 ...

  3. Android-Java-面向对象的代码例子

    需求一:用手机打电话,发短信,看视频,听音乐,用面向对象思想实现: package android.java.oop01; /** * 1.既然是面向/面对 --> 对象 就要把 (用手机打电话 ...

  4. node.js实现WebSocket

    最近在学习“HTML5游戏开发实战”,其中第8章内容是使用WebSocket来构建多人游戏---<你画我猜>.然而在实现过程中,却一直出错: 客户端请求时,服务器端会报错并终止: 而浏览器 ...

  5. TDateTimePicker中Date与Time的误导

    Delphi DateTime,Date,Time TDateTimePicker DateTimeDateTimeDateTimePicker 一.DateTime,Date,Time存储方式本质上 ...

  6. 如何在Notepad ++中每两行合并

    \n 新行 \r 行首 [^\n]+ 是排除\n外的任意字符 [^\r]+ 是排除\r外的任意字符 用[^\n]或[^\r]都不行..老是匹配到空的东西..原来是这么一回事..用[^\n\r]+就行了 ...

  7. java批量解压文件夹下的所有压缩文件(.rar、.zip、.gz、.tar.gz)

    // java批量解压文件夹下的所有压缩文件(.rar..zip..gz..tar.gz) 新建工具类: package com.mobile.utils; import com.github.jun ...

  8. WebDriver高级应用实例(2)

    2.1在日期选择器上进行日期选择 被测网页的网址: https://www.html5tricks.com/demo/Kalendae/index.html Java语言版本的API实例代码 impo ...

  9. POJ 2719

    #include<iostream> #include<stdio.h> using namespace std; ]; int _pow(int m,int n); int ...

  10. #Python学习#python虚拟环境——virtualenv

    前言 在Ubuntu系统中,系统一般会默认安装python2.x和3.x,像我近期买的阿里云ECS默认安装了2.7.2和3.5.2,所有pip安装的第三方包都会被放在默认的site-apckages目 ...