P2150 [NOI2015] 寿司晚宴

刚开始看错题了,推了一个与原题类似的 DP 方程,然后不会优化,笑了。

思路

首先看到 \(n\) 很小,然后质因子个数就更少了。

因此第一反应是将所有的质因子状压进一个状态里,然后互相判断有没有互质即可。

但是 500 以内的质因子个数并不少,有接近 100 个,因此这只是 30 分的暴力。

但是有一个比较常见的优化:每个数只会有一个大于 \(\sqrt n\) 的质因子。因此我们将这种因子称为“大质因子”。

我们预处理出每个数的大质因子是多少,将所有大质因子相同的数一起转移。

与暴力类似的,我们设 \(f1_{s1,s2},f2_{s1,s2}\) 分别表示所有大质因子相同的数只能第一个人选或不选的方案数,只能第二个人选或不选的方案数。(因为两个人不能同时选有相同大质因子相同的数)

注意,这里的 \(s1,s2\) 只压缩了“小质因子”。

然后假设当前枚举到第 \(i\) 个数,其所有小质因子的压缩为 \(s_i\),有转移

\[\begin{aligned}
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_{s1,s2}\gets f1_{s1,s2}+f2_{s1,s2}-dp_{s1,s2}
\]

减掉一个 \(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] 寿司晚宴 题解的更多相关文章

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

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

  2. UOJ #129 / BZOJ 4197 / 洛谷 P2150 - [NOI2015]寿司晚宴 (状压dp+数论+容斥)

    题面传送门 题意: 你有一个集合 \(S={2,3,\dots,n}\) 你要选择两个集合 \(A\) 和 \(B\),满足: \(A \subseteq S\),\(B \subseteq S\), ...

  3. 并不对劲的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 ...

  4. 洛谷$P2150\ [NOI2015]$寿司晚宴 $dp$

    正解:$dp$ 解题报告: 传送门$QwQ$. 遇事不决写$dp$($bushi$.讲道理这题一看就感觉除了$dp$也没啥很好的算法能做了,于是考虑$dp$呗 先看部分分?$30pts$发现质因数个数 ...

  5. p2150 [NOI2015]寿司晚宴

    传送门 分析 我们发现对于大于$\sqrt(n)$的数每个数最多只会包含一个 所以我们把每个数按照大质数的大小从小到大排序 我们知道对于一种大质数只能被同一个人取 所以f1表示被A取,f2表示被B取 ...

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

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

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

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

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

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

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

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

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

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

随机推荐

  1. DeepSeek+AnythingLLM,搭建本地AI知识库,真的太香了!三分钟搞定智能助手,小白也能轻松上手!

    1. 痛点暴击:你的知识管理还在原始时代吗? 你是否每次查找文档翻遍文件夹,会议纪要总在关键时刻"失踪"? 别慌!今天揭秘一个"真香"组合--DeepSeek+ ...

  2. DeepSeek本地部署

    一.ollama ollama是一个管理和运行所有大模型.开源大模型的平台.在官网的Models中可以看到deepseek-r1的AI模型 1.在官网中下载对应系统的ollama,下载时需要开墙,或者 ...

  3. Lombok 只会用@Setter @Getter @Data ? 老鸟带你玩转lombok

    lombok的官网 官方网址 : https://projectlombok.org lombok 稳定特性文档:https://projectlombok.org/features/ lombok ...

  4. MySQL - [13] binlog、redolog、undolog、delaylog

    题记部分 bin log redo log undo log 3.1.什么是undo log 事务是需要保证原子性的,也就是说,事务中的操作要么全部完成,要么什么也不做.但有如下情况,会造成事务执行不 ...

  5. CDH - [01] 概述

    一.什么是CDH   CDH是Cloudera's Distribution Including Apache Hadoop的缩写,即Cloudera公司发布的Hadoop发行版.它是一个为Hadoo ...

  6. Amazon S3 概念及如何集成到 .net 8 C#

    Amazon S3(Simple Storage Service)是一个高度可扩展.数据可用性高.安全性强的对象存储服务. Amazon S3 使用对象存储架构,数据以对象的形式存储在桶(bucket ...

  7. CICFlowMeter 使用方法

    前言 因实验需要提取流量特征,就找到了这个较为著名的流量特征提取工具 CICFlowMeter .例如 CIC-IDS-2017 数据集就是通过这个工具提取而来. 网络上的教程众说纷纭,但我始终是无法 ...

  8. ‌MySQL 8.0下 200GB大表备份,利用传输表空间解决停服发版表备份问题

    ‌MySQL 8.0下 200GB大表备份,利用传输表空间解决停服发版表备份问题 问题背景 在停服发版更新的时候,需要预先对一个业务表进行备份,该业务表是200GB大小的表,大概200亿行数据. 因为 ...

  9. BGP路由优选原则

    0 丢弃下一跳不可达的路由 1 优选Preference_Value值最高的路由(本设备有效) Pref-Val:协议首选值 华为私有的属性,只具有本地(本设备)意义,缺省情况下为0,越大越优,0-6 ...

  10. 模型蒸馏(Distillation)案例--从DeepSeek-R1-1.5B 到 Qwen-2.5-1.5B 的模型蒸馏

    DeepSeek-R1-1.5B 到 Qwen-2.5-1.5B 的模型蒸馏(Distillation) 本文重点进行DeepSeek-R1-1.5B 到 Qwen-2.5-1.5B 的模型蒸馏(Di ...