【BZOJ4197】【NOI2015】寿司晚宴(动态规划)
【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】寿司晚宴(动态规划)的更多相关文章
- [UOJ#129][BZOJ4197][Noi2015]寿司晚宴
[UOJ#129][BZOJ4197][Noi2015]寿司晚宴 试题描述 为了庆祝 NOI 的成功开幕,主办方为大家准备了一场寿司晚宴.小 G 和小 W 作为参加 NOI 的选手,也被邀请参加了寿司 ...
- [BZOJ4197][Noi2015]寿司晚宴
4197: [Noi2015]寿司晚宴 Time Limit: 10 Sec Memory Limit: 512 MBSubmit: 412 Solved: 279[Submit][Status] ...
- BZOJ4197 [Noi2015]寿司晚宴 【状压dp】
题目链接 BZOJ4197 题解 两个人选的数都互质,意味着两个人选择了没有交集的质因子集合 容易想到将两个人所选的质因子集合作为状态\(dp\) \(n\)以内质数很多,但容易发现\(\sqrt{n ...
- bzoj4197 [Noi2015]寿司晚宴——状压DP
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4197 首先,两个人选的数都互质可以看作是一个人选了一个数,就相当于选了一个质因数集合,另一个 ...
- BZOJ_4197_[Noi2015]寿司晚宴_状态压缩动态规划
BZOJ_4197_[Noi2015]寿司晚宴_状态压缩动态规划 Description 为了庆祝 NOI 的成功开幕,主办方为大家准备了一场寿司晚宴.小 G 和小 W 作为参加 NOI 的选手,也被 ...
- 【BZOJ4197】[Noi2015]寿司晚宴 状压DP+分解质因数
[BZOJ4197][Noi2015]寿司晚宴 Description 为了庆祝 NOI 的成功开幕,主办方为大家准备了一场寿司晚宴.小 G 和小 W 作为参加 NOI 的选手,也被邀请参加了寿司晚宴 ...
- 【BZOJ-4197】寿司晚宴 状压DP
4197: [Noi2015]寿司晚宴 Time Limit: 10 Sec Memory Limit: 512 MBSubmit: 694 Solved: 440[Submit][Status] ...
- BZOJ 4197: [Noi2015]寿司晚宴( dp )
N^0.5以内的质数只有8个, dp(i, j, k)表示用了前i个大质数(>N^0.5), 2人选的质数(<=N^0.5)集合分别为j, k时的方案数. 转移时考虑当前的大质数p是给哪个 ...
- [NOI2015]寿司晚宴 --- 状压DP
[NOI2015]寿司晚宴 题目描述 为了庆祝NOI的成功开幕,主办方为大家准备了一场寿司晚宴. 小G和小W作为参加NOI的选手,也被邀请参加了寿司晚宴. 在晚宴上,主办方为大家提供了n−1种不同的寿 ...
- BZOJ 4197: [Noi2015]寿司晚宴 状态压缩 + 01背包
4197: [Noi2015]寿司晚宴 Time Limit: 10 Sec Memory Limit: 512 MB Description 为了庆祝 NOI 的成功开幕,主办方为大家准备了一场寿 ...
随机推荐
- 通知的多线程问题 iOS
发送通知在子线程,接受也在子线程.如果子线程操作UI,会打印一推日志,告诉我们应该主线程操作.
- TensorFlow(实战深度学习框架)----深层神经网络(第四章)
深层神经网络可以解决部分浅层神经网络解决不了的问题. 神经网络的优化目标-----损失函数 深度学习:一类通过多层非线性变化对高复杂性数据建模算法的合集.(两个重要的特性:多层和非线性) 线性模型的最 ...
- HTTP 两种基本请求方法 GET和 POST的区别
GET方法 1.GET交互方式是从服务器上获取数据,而并非修改数据,所以GET交互方式是安全的.就像数据库查询一样,从数据库查询数据,并不会影响数据库的数据信息,对数据库来说,也就是安全的.2.GET ...
- (转)使用Python和OpenCV检测图像中的物体并将物体裁剪下来
原文链接:https://blog.csdn.net/liqiancao/article/details/55670749 介绍 硕士阶段的毕设是关于昆虫图像分类的,代码写到一半,上周五导师又给我新的 ...
- Shiro 修改权限,刷新权限
shiro 访问鉴权:Realm AuthorizingRealm->doGetAuthorizationInfo doGetAuthorizationInfo protected abstra ...
- QSS 样式示例:QTreeWidget, QComboBox,QSlider,QSpinBox
目录 Image 填充整个控件的区域 QTreeWidget QSpinbox 的上翻下翻按钮和箭头 QComboBox 的设置,大坑 QSlider 最近需要对一个软件加上Qt界面和 的样式,第一次 ...
- 记因内核版本错误导致U盘不能识别的问题解决
U盘插上电脑,发现没有自动挂载.然后运行sudo fdisk -l一看,发现并没有U盘所对应的设备,也就是U盘不能识别了!以前从没在Linux上遇到这种问题,通过查资料得知,要识别U盘,需要装载usb ...
- leetcode个人题解——#56 Merge Intervals
思路,先按照结构体中start进行排序,然后遍历比较前后项是否有重合. 第一次用到三参数形式的sort(),第三个参数的bool函数要写到类外才通过. /** * Definition for an ...
- 无法设置主体sa的凭据
设置允许SQL Server身份登录 1.先用Window方式登陆进去,选择数据库实例,右键选择属性——安全性:把服务器身份验证选项从“Window身份验证模式”改为“SQLServer和Window ...
- 一个简单的rest_framework demo
models.py from django.db import models class UserInfo(models.Model): username = models.CharField(max ...