P2150 [NOI2015] 寿司晚宴 题解
P2150 [NOI2015] 寿司晚宴
刚开始看错题了,推了一个与原题类似的 DP 方程,然后不会优化,笑了。
思路
首先看到 \(n\) 很小,然后质因子个数就更少了。
因此第一反应是将所有的质因子状压进一个状态里,然后互相判断有没有互质即可。
但是 500 以内的质因子个数并不少,有接近 100 个,因此这只是 30 分的暴力。
但是有一个比较常见的优化:每个数只会有一个大于 \(\sqrt n\) 的质因子。因此我们将这种因子称为“大质因子”。
我们预处理出每个数的大质因子是多少,将所有大质因子相同的数一起转移。
与暴力类似的,我们设 \(f1_{s1,s2},f2_{s1,s2}\) 分别表示所有大质因子相同的数只能第一个人选或不选的方案数,只能第二个人选或不选的方案数。(因为两个人不能同时选有相同大质因子相同的数)
注意,这里的 \(s1,s2\) 只压缩了“小质因子”。
然后假设当前枚举到第 \(i\) 个数,其所有小质因子的压缩为 \(s_i\),有转移
f1_{s1 \cup s_i,s2} \gets f1_{s1 \cup s_i,s2}+f1_{s1,s2},s2\cap s_i=\varnothing \\
f1_{s1 ,s2\cup s_i} \gets f1_{s1 ,s2\cup s_i}+f1_{s1,s2},s1\cap s_i=\varnothing
\end{aligned}
\]
然后设 \(dp_{s1,s2}\) 在大质因子不同的阶段间转移。每次一个阶段时将 \(dp\) 复制进 \(f1,f2\) 中,结束时用 \(f1,f2\) 更新 \(dp\) 即可。具体而言,结束时有
\]
减掉一个 \(dp\) 是为了减掉重复的情况。答案就是 \(dp\) 的和。
code
注意可能有数没有质因子大于 \(\sqrt n\)。发现这个时候其质因子个数必定小于等于 \(8\),因此直接在 \(dp\) 数组上用暴力做即可。
#include<bits/stdc++.h>
using namespace std;
#define int long long
const int N=505;
int n,p,pri[N]={2,3,5,7,11,13,17,19},dp[N][N],f1[N][N],f2[N][N];
struct node{int s,mp;}a[N];
bool cmp(node x,node y){return x.mp<y.mp;}
void add(int &x,int y){x=(x+y+p)%p;}
signed main(){
ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
cin>>n>>p;
for(int i=2;i<=n;i++){
int tmp=i;
for(int j=0;j<8;j++){
while(tmp%pri[j]==0) tmp/=pri[j],a[i].s|=(1<<j);
}
a[i].mp=tmp;
}
sort(a+2,a+n+1,cmp);int tl=2,tr=2;dp[0][0]=1;
while(a[tr+1].mp==1) tr++;
for(int i=tl;i<=tr;i++){
for(int s1=255;s1>=0;s1--) for(int s2=255;s2>=0;s2--){
if((s2&a[i].s)==0) add(dp[s1|a[i].s][s2],dp[s1][s2]);
if((s1&a[i].s)==0) add(dp[s1][s2|a[i].s],dp[s1][s2]);
}
}
for(int l=tr+1,r;l<=n;){
r=l;while(a[r].mp==a[r+1].mp) r++;
for(int s1=255;s1>=0;s1--) for(int s2=255;s2>=0;s2--) f1[s1][s2]=dp[s1][s2],f2[s1][s2]=dp[s1][s2];
for(int i=l;i<=r;i++)for(int s1=255;s1>=0;s1--) for(int s2=255;s2>=0;s2--){
if((s2&a[i].s)==0) add(f1[s1|a[i].s][s2],f1[s1][s2]);
if((s1&a[i].s)==0) add(f2[s1][s2|a[i].s],f2[s1][s2]);
}
for(int s1=255;s1>=0;s1--) for(int s2=255;s2>=0;s2--) (dp[s1][s2]=f1[s1][s2]+f2[s1][s2]-dp[s1][s2]+p)%=p;
l=r+1;
}
int ans=0;
for(int s1=255;s1>=0;s1--) for(int s2=255;s2>=0;s2--) (ans+=dp[s1][s2])%=p;
cout<<ans<<'\n';return 0;
}
P2150 [NOI2015] 寿司晚宴 题解的更多相关文章
- BZO4197 & 洛谷2150 & UOJ129:[NOI2015]寿司晚宴——题解
https://www.lydsy.com/JudgeOnline/problem.php?id=4197 https://www.luogu.org/problemnew/show/P2150 ht ...
- UOJ #129 / BZOJ 4197 / 洛谷 P2150 - [NOI2015]寿司晚宴 (状压dp+数论+容斥)
题面传送门 题意: 你有一个集合 \(S={2,3,\dots,n}\) 你要选择两个集合 \(A\) 和 \(B\),满足: \(A \subseteq S\),\(B \subseteq S\), ...
- 并不对劲的bzoj4197:loj2131:uoj129:p2150:[NOI2015]寿司晚宴
题目大意 有两个集合\(S_1,S_2 \subseteq [2,n] (n\leq 500)\),且对于\(\forall x\in S_1,y\in S_2 , gcd(x,y)=1\) 求\(S ...
- 洛谷$P2150\ [NOI2015]$寿司晚宴 $dp$
正解:$dp$ 解题报告: 传送门$QwQ$. 遇事不决写$dp$($bushi$.讲道理这题一看就感觉除了$dp$也没啥很好的算法能做了,于是考虑$dp$呗 先看部分分?$30pts$发现质因数个数 ...
- p2150 [NOI2015]寿司晚宴
传送门 分析 我们发现对于大于$\sqrt(n)$的数每个数最多只会包含一个 所以我们把每个数按照大质数的大小从小到大排序 我们知道对于一种大质数只能被同一个人取 所以f1表示被A取,f2表示被B取 ...
- 【BZOJ4197】[Noi2015]寿司晚宴 状压DP+分解质因数
[BZOJ4197][Noi2015]寿司晚宴 Description 为了庆祝 NOI 的成功开幕,主办方为大家准备了一场寿司晚宴.小 G 和小 W 作为参加 NOI 的选手,也被邀请参加了寿司晚宴 ...
- [UOJ#129][BZOJ4197][Noi2015]寿司晚宴
[UOJ#129][BZOJ4197][Noi2015]寿司晚宴 试题描述 为了庆祝 NOI 的成功开幕,主办方为大家准备了一场寿司晚宴.小 G 和小 W 作为参加 NOI 的选手,也被邀请参加了寿司 ...
- BZOJ 4197: [Noi2015]寿司晚宴 状态压缩 + 01背包
4197: [Noi2015]寿司晚宴 Time Limit: 10 Sec Memory Limit: 512 MB Description 为了庆祝 NOI 的成功开幕,主办方为大家准备了一场寿 ...
- [BZOJ4197][Noi2015]寿司晚宴
4197: [Noi2015]寿司晚宴 Time Limit: 10 Sec Memory Limit: 512 MBSubmit: 412 Solved: 279[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是给哪个 ...
随机推荐
- Hbuilder使用快捷键
Hbuilder的使用 1.Hbuilder基本操作设置基本外观文字大小,申请账号.2.Hbuilder快捷键- 新建菜单: ctrl + N- 新建: ctrl + N- 关闭: ctrl ...
- 使用mongodb、Kafka保存mqtt消息
一.引言 随着物联网技术的迅猛发展,大量的设备和传感器产生了海量的数据.本文利用了 MQTT.Kafka 和 MongoDB 各自的优点,满足实时数据处理和大规模数据存储的需求. 如图: 二.总结 优 ...
- linux的使用(3)
1.tar 包 压缩和解压 (1)tar -cvf 打包 (2)tar -xvf 解压压缩包 图片 (3)tar.gz 打包 案例:tar -zcvf ys.tar.gz aa bb hh tt (4 ...
- JUC并发—12.ThreadLocal源码分析
大纲 1.ThreadLocal的特点介绍 2.ThreadLocal的使用案例 3.ThreadLocal的内部结构 4.ThreadLocal的核心方法源码 5.ThreadLocalMap的核心 ...
- vue - [03] Hello World~
题记部分 (1)选择一个合适的目录,然后进入终端,执行:vue create account-manager (2)切换目录到account-manager,执行npm run serve启动开发服务 ...
- 基于 Trae Claude-3.7 从0到1 打造加密货币钱包Dompet-App
从0到1:用Trae Claude-3.7打造加密货币钱包Dompet-App 项目介绍 大家好!今天我要分享如何使用强大的AI助手Trae Claude-3.7,从零开始构建一款功能丰富的加密货币钱 ...
- mysql 获取数据库名、表名、字段名、根据表结构创建新表
1.查询当前使用的数据库 select database(): 2.获取当前数据库表 select * from information_schema.TABLES where TABLE_SCHEM ...
- linux系统批量查找网站源码并替换字符,查找替换指定内容
问题描述:维护中需要批量修改代码中某个字符,如果单个打开页面进行修改则效率过低,linux系统下借助grep命令快速查找替换 命令示例1: grep -rl '查找的内容' . | xargs sed ...
- openpyxl 写入字典
def write(self,data_path, sheetname,value): index = len(value) workbook = openpyxl.Workbook() sheet ...
- css 保留后端 textarea 中的换行与空格字符
原文链接:https://blog.jijian.link/2020-10-22/css-pre/ 如果后台使用 textarea 输入内容,在前段显示需要保留换行符与空白字符,该如何做? 常规方法 ...