【BZOJ4197】【NOI2015】寿司晚宴(动态规划)

题面

BZOJ

从\([2,n]\)中选择两个集合(可以为空集),使得两个集合中各选一个数出来,都互质。

求方案数。

题解

对于\(500\)以内的所有数,它的最大质因子如果大于\(\sqrt n\),那么便只有一个。

利用这一点,我们把所有数全部用小于\(\sqrt n\)的质数来分解。

最后剩下的结果一定是一个\(\gt \sqrt n\)的质数或者\(1\),再乘上\(\le \sqrt n\)的质数。

小于\(\sqrt n\)的质数很少,只有\(8\)个,可以按照这个进行状压。

显然,拥有大于\(\sqrt n\)质因数的所有数可以归结为一类,并且他们只能一起放在一个集合中。

所以考虑状态\(f[i][j]\)表示第一个人选择了质因数集合\(i\),第二个人选择了\(j\)

因为大于\(\sqrt n\)的质因数放在一起考虑,所以不将他压进状态。

我们再枚举这个质因数放进哪个集合就好了,这个可以再诶外开数组维护。

当这个质因数的所有数都考虑完了之后,

当前的贡献就是\(f[i][j]=g[0][i][j]+g[1][i][j]-f[i][j]\)

其中\(g\)数组表示把当前这个质因数给了第一个人还是第二个人,后面两维意义和\(f\)相同的方案数。

因为\(f[i][j]\)是前面所有其他质因子的答案,当前在求和的时候存在没有将当前质因子的任何一个数放进任意一个集合,所以这里会被算两遍,把它减掉就好了。

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
#define ll long long
int n,MOD,ans;
void add(int &x,int y){x+=y;if(x>=MOD)x-=MOD;}
int f[1<<8][1<<8],g[2][1<<8][1<<8];
int p[8]={2,3,5,7,11,13,17,19};
pair<int,int> a[505];
int main()
{
scanf("%d%d",&n,&MOD);
for(int i=2;i<=n;++i)
{
int x=i;
for(int j=0;j<8;++j)
while(x%p[j]==0)x/=p[j],a[i].second|=1<<j;
a[i].first=x;
}
sort(&a[2],&a[n+1]);f[0][0]=g[0][0][0]=g[1][0][0]=1;
for(int z=2;z<=n;++z)
{
for(int x=255;~x;--x)
for(int y=255;~y;--y)
if(!(x&y))
{
if(!(y&a[z].second))add(g[0][x|a[z].second][y],g[0][x][y]);
if(!(x&a[z].second))add(g[1][x][y|a[z].second],g[1][x][y]);
}
if(a[z].first==1||a[z].first!=a[z+1].first)
{
for(int i=0;i<1<<8;++i)
for(int j=0;j<1<<8;++j)
if(!(i&j))f[i][j]=(g[0][i][j]+g[1][i][j]-f[i][j])%MOD,add(f[i][j],MOD);
memcpy(g[0],f,sizeof(g[0]));memcpy(g[1],f,sizeof(g[1]));
}
}
for(int i=0;i<1<<8;++i)
for(int j=0;j<1<<8;++j)
if(!(i&j))add(ans,f[i][j]);
printf("%d\n",ans);
return 0;
}

【BZOJ4197】【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. BZOJ4197 [Noi2015]寿司晚宴 【状压dp】

    题目链接 BZOJ4197 题解 两个人选的数都互质,意味着两个人选择了没有交集的质因子集合 容易想到将两个人所选的质因子集合作为状态\(dp\) \(n\)以内质数很多,但容易发现\(\sqrt{n ...

  4. bzoj4197 [Noi2015]寿司晚宴——状压DP

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4197 首先,两个人选的数都互质可以看作是一个人选了一个数,就相当于选了一个质因数集合,另一个 ...

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

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

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

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

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

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

  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]寿司晚宴 --- 状压DP

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

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

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

随机推荐

  1. cogs1533 [HNOI2002]营业额统计

    cogs1533 [HNOI2002]营业额统计 啦啦啦啦 不维护区间的平衡树题都是树状数组+二分练手题! 不会的参考我的普通平衡树的多种神奇解法之BIT+二分答案 和上一篇博文完全一样2333 另外 ...

  2. linux设置定时任务调用接口

    1.设置目录 cd /var/spool/cron 2.编辑文件(当前登录用户,不一定是root) vim root 3.添加内容 0 0 * * * wget http://192.144.141. ...

  3. OpenCL入门:(二:用GPU计算两个数组和)

    本文编写一个计算两个数组和的程序,用CPU和GPU分别运算,计算运算时间,并且校验最后的运算结果.文中代码偏多,原理建议阅读下面文章,文中介绍了OpenCL相关名词概念. http://opencl. ...

  4. Selenium2+python自动化-操作浏览器基本方法

    前言 从这篇开始,正式学习selenium的webdriver框架.我们平常说的 selenium自动化,其实它并不是类似于QTP之类的有GUI界面的可视化工具,我们要学的是webdriver框架的A ...

  5. String、StringBuffer、StringBuilder有什么区别

    区别 先说说String和StringBuffer/StringBuilder: String是标准的不可变类,是一个字符串常量池,并且声明的对象在方法中是唯一存在的. StringBuffer/St ...

  6. linux下搭建python机器学习环境

    前言 在 linux 下搭建 python 机器学习环境还是比较容易的,考虑到包依赖的问题,最好建立一个虚拟环境作为机器学习工作环境,在建立的虚拟环境中,再安装各种需要的包,主要有以下6个(这是看这个 ...

  7. charles 在mac下 抓取 https包

    1.  打开charles --> help --> SSL proxying --> install charles root certificate 2. 在弹出的添加证书窗口中 ...

  8. WeakHashMap介绍

    WeakHashMap简介 WeakHashMap 继承于AbstractMap,实现了Map接口.    和HashMap一样,WeakHashMap 也是一个散列表,它存储的内容也是键值对(key ...

  9. Binary Tree(生成二叉树)

    Description Background Binary trees are a common data structure in computer science. In this problem ...

  10. Alpha阶段第2周/共2周 Scrum立会报告+燃尽图 03

    此次作业要求参见https://edu.cnblogs.com/campus/nenu/2018fall/homework/2286 Scrum master:范洪达 一.小组介绍 组长:王一可 组员 ...