题目描述

为了庆祝 NOI 的成功开幕,主办方为大家准备了一场寿司晚宴。小 G 和小 W 作为参加 NOI 的选手,也被邀请参加了寿司晚宴。

在晚宴上,主办方为大家提供了 n−1 种不同的寿司,编号 1,2,3,…,n−1,其中第 i 种寿司的美味度为 i+1 (即寿司的美味度为从 2 到 n)。

现在小 G 和小 W 希望每人选一些寿司种类来品尝,他们规定一种品尝方案为不和谐的当且仅当:小 G 品尝的寿司种类中存在一种美味度为 x 的寿司,小 W 品尝的寿司中存在一种美味度为 y 的寿司,而 x 与 y 不互质。

现在小 G 和小 W 希望统计一共有多少种和谐的品尝寿司的方案(对给定的正整数 p 取模)。注意一个人可以不吃任何寿司。

输入格式

输入文件的第 1 行包含 2 个正整数 n,p,中间用单个空格隔开,表示共有 n 种寿司,最终和谐的方案数要对 p 取模。

输出格式

输出一行包含 1 个整数,表示所求的方案模 p 的结果。

题解

注意到所有和谐的方案,两人的质数集合一定是不相交的。

对于所有大于根号的质数,不存在一个数同时包含两个这样的数。打个比方,假如n是100,那么我们在考虑17的时候,就不需要考虑11,13有没有取。而小于根号的质数就不具备有这个性质。所以对于大于根号的质数是一个分层的关系,层与层之间是无后效性的,所以我们可以分层来DP。

计f[i][A][B]表示在第i层里一个人集合为A,另一个人集合为B的方案。然后枚举子集、前缀和转移一下就好了。

代码

 #include <cstdio>
#include <algorithm>
#include <cstring> #define R register
#define maxn 510
int pr[maxn], prcnt, mp[maxn], r[maxn];
int f[maxn][][][], g[maxn][][], tf[][][];
bool vis[maxn];
inline bool cmp(R int a, R int b)
{
return mp[a] < mp[b];
}
int main()
{
R int n, p; scanf("%d%d", &n, &p);
for (R int i = ; i <= n; ++i)
{
r[i] = i;
if (!vis[i]) pr[++prcnt] = mp[i] = i;
for (R int j = ; j <= prcnt && i * pr[j] <= n; ++j)
{
vis[i * pr[j]] = ;
mp[i * pr[j]] = mp[i];
if (i % pr[j] == ) break;
}
}
std::sort(r + , r + n + , cmp);
R int tot = ;
g[][][] = % p;
for (R int i = ; i <= n; ++i)
{
R int x = r[i], tS = ;
if (mp[x] < || mp[r[i]] != mp[r[i - ]]) ++tot;
// printf("%d %d %d %d\n", i, r[i], mp[r[i]], tot);
for (R int j = ; j <= prcnt && pr[j] < ; ++j)
if (x % pr[j] == ) tS |= << (j - ); memcpy(tf, f[tot], sizeof (tf));
for (R int A = ; A < ; ++A)
{
R int mB = ~A & ;
for (R int B = mB; B; B = (B - ) & mB)
if (!(B & tS))
(f[tot][A | tS][B][] += (g[tot - ][A][B] + tf[A][B][]) % p) %= p,
(f[tot][B][A | tS][] += (g[tot - ][B][A] + tf[B][A][]) % p) %= p;
(f[tot][A | tS][][] += (g[tot - ][A][] + tf[A][][]) % p) %= p;
(f[tot][][A | tS][] += (g[tot - ][][A] + tf[][A][]) % p) %= p;
} for (R int A = ; A < ; ++A)
{
R int mB = ~A & ;
for (R int B = mB; B; B = (B - ) & mB)
g[tot][A][B] = (g[tot - ][A][B] + (f[tot][A][B][] + f[tot][A][B][]) % p) % p;
g[tot][A][] = (g[tot - ][A][] + (f[tot][A][][] + f[tot][A][][]) % p) % p;
}
}
R int ans = ;
for (R int A = ; A < ; ++A)
{
R int mB = ~A & ;
for (R int B = mB; B; B = (B - ) & mB)
(ans += g[tot][A][B]) %= p;
(ans += g[tot][A][]) %= p;
}
printf("%d\n", ans);
return ;
}

【UOJ#129】 【NOI2015】寿司晚宴的更多相关文章

  1. [UOJ#129][BZOJ4197][Noi2015]寿司晚宴

    [UOJ#129][BZOJ4197][Noi2015]寿司晚宴 试题描述 为了庆祝 NOI 的成功开幕,主办方为大家准备了一场寿司晚宴.小 G 和小 W 作为参加 NOI 的选手,也被邀请参加了寿司 ...

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

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

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

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

  4. BZOJ_4197_[Noi2015]寿司晚宴_状态压缩动态规划

    BZOJ_4197_[Noi2015]寿司晚宴_状态压缩动态规划 Description 为了庆祝 NOI 的成功开幕,主办方为大家准备了一场寿司晚宴.小 G 和小 W 作为参加 NOI 的选手,也被 ...

  5. [NOI2015]寿司晚宴 --- 状压DP

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

  6. 【BZOJ4197】[Noi2015]寿司晚宴 状压DP+分解质因数

    [BZOJ4197][Noi2015]寿司晚宴 Description 为了庆祝 NOI 的成功开幕,主办方为大家准备了一场寿司晚宴.小 G 和小 W 作为参加 NOI 的选手,也被邀请参加了寿司晚宴 ...

  7. BZOJ 4197: [Noi2015]寿司晚宴 状态压缩 + 01背包

    4197: [Noi2015]寿司晚宴 Time Limit: 10 Sec  Memory Limit: 512 MB Description 为了庆祝 NOI 的成功开幕,主办方为大家准备了一场寿 ...

  8. BZO4197 & 洛谷2150 & UOJ129:[NOI2015]寿司晚宴——题解

    https://www.lydsy.com/JudgeOnline/problem.php?id=4197 https://www.luogu.org/problemnew/show/P2150 ht ...

  9. NOI2015 寿司晚宴

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

  10. bzoj 4199 [NOI2015]寿司晚宴

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

随机推荐

  1. pyhton sort()无返回值

    li3=['] li4=li3.sort()#sort是没有返回值得,打印的是none,对列表进行升序排列 print(li4) print(li3) 输出结果是None['123', '123', ...

  2. @RequestMapping-占位符映射

    占位符映射

  3. 第十八篇 JS传参数

    JS传参数   参数,这是个什么东西呢?简单的说吧,我们去玩别人的网站,一般来个登录,有用户名和密码,当我们输入正确之后,那么这用户名和密码里面的值,就是参数的值,它将这个值传给“参数”,然后提交到后 ...

  4. xml_dom解析之二

    dom解析(二) 通过代码创建一个xml文件 package xml4; import java.io.File; import javax.xml.parsers.DocumentBuilder; ...

  5. xml_dom解析

    DOM解析(一) 采用dom解析,会将xml文档全部载入到内存当中,然后将xml文档中的所有内容转换为tree上的节点(对象). 优点: 可以随机解析 可以修改文件 可以创建xml文件 缺点: 适合解 ...

  6. Coinbase 雇员被 Firefox 0day 漏洞攻击

    Firefox 刚刚修复的 0day 漏洞被用于攻击 Coinbase 雇员.Coinbase 安全团队的 Philip Martin 称,攻击者组合利用了两个 0day 漏洞,其一是远程代码执行漏洞 ...

  7. 常用数据存储格式之xml

    常用数据存储格式介绍 XML 被设计用来传输和存储数据,其焦点是数据的内容. HTML 被设计用来显示数据,其焦点是数据的外观. 语法规则: XML 文档必须有一个根元素 XML元素都必须有一个关闭标 ...

  8. 排序——插入排序(C语言)

    void insertSort(int* a,int T){ int tmp,p; ;i<T;i++){ tmp=a[i]; p=i-; &&tmp<a[p]){ a[p+ ...

  9. Codeforces Round #581 (Div. 2)A BowWow and the Timetable (思维)

    A. BowWow and the Timetable time limit per test1 second memory limit per test256 megabytes inputstan ...

  10. LCA-tarjan understand

    首先是最近公共祖先的概念(什么是最近公共祖先?): 在一棵没有环的树上,每个节点肯定有其父亲节点和祖先节点,而最近公共祖先,就是两个节点在这棵树上深度最大的公共的祖先节点. 换句话说,就是两个点在这棵 ...