【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 的成功开幕,主办方为大家准备了一场寿 ...
随机推荐
- XAF-如何在详细视图界面显示按钮(含示例项目下载)
默认情况下,指定了按钮的Category后,将在对应的按钮容器显示按钮.有时候,我们需要将按钮显示在详细视图中. 本示例源码 创建一个控制器,并填加按钮.设置好了所有ID.Caption后,给Cate ...
- 第六篇 native 版本的Postman如何通过代理服务器录制Web及手机APP请求
第四篇主要介绍了chrome app版本的postman如何安装及如何录制Web脚本,比较简单. 但是chrome app 版本和native 版本相比,对应chrome app 版本官方已经放弃支持 ...
- c# ms chart 控件使用方法
第一个简单的chart: spline// Create new data series and set it's visualattributes Series series = new ...
- 第九次ScrumMeeting博客
第九次ScrumMeeting博客 本次会议于11月4日(六)22时整在3公寓725房间召开,持续20分钟. 与会人员:刘畅.辛德泰.窦鑫泽.张安澜.赵奕.方科栋. 1. 每个人的工作(有Issue的 ...
- 2017年度网络安全服务企业TOP50
何谓“大安全”? 近几年来,网络安全和信息安全领域不时出现引发社会各界关注的事件. 2014年,政府采购计划对WIN8说“不”,同年,中央网络安全和信息化领导小组成立,将网络安全上升到了国家战略高度, ...
- Knight Moves(广搜BFS)
Description A friend of you is doing research on the Traveling Knight Problem (TKP) where you are to ...
- 172322 2018-2019-1 《Java软件结构与数据结构》实验一报告
172322 2018-2019-1 <Java软件结构与数据结构>实验一报告 课程:<程序设计与数据结构> 班级: 1723 姓名: 张昊然 学号:20172322 实验教师 ...
- linux awk,sort,uniq,wc,cut命令详解
1.awk awk是行处理器: 相比较屏幕处理的优点,在处理庞大文件时不会出现内存溢出或是处理缓慢的问题,通常用来格式化文本信息 $ 表示当前行 $ 表示第一列 NF 表示一共有多少列 $NF 表示最 ...
- struts2文件上传突破2M限制
struts配置文件 <action name="upload" class="strutsFileUpload"> <result name ...
- lintcode-477-被围绕的区域
477-被围绕的区域 给一个二维的矩阵,包含 'X' 和 'O', 找到所有被 'X' 围绕的区域,并用 'X' 填充满. 样例 给出二维矩阵: X X X X X O O X X X O X X O ...