题目链接:戳我

30pts还是很好写的,因为30以内的质因数就没有几个,直接状压就可以了.
但是如果范围扩大到500呢?我们考虑后面的数怎么处理.

首先观察到19之后的数最多只能出现一次,那么我们直接状压这前八个质数就行了.后面的我们可以手动添加一下(为了方便,对于当前遍历的值,下面我们称前八个为小因数,后面的为大因数)

处理出来每个数的小因数的状态,方便下面转移.同时也处理出来它的大因数.而且我们知道大因数应该排序一下(因为相同的肯定要一起处理)--->大概就是一个分块的思想,因为一个质因数只能放到一个集合中.

具体来讲,是开一个数组\(dp[i][j]\)表示A状态为i,B状态为j,方案数.然后两个辅助数组\(f1[i][j]\)表示A状态为i,B状态为j,当前这个数的大因数给了A,\(f2[i][j]\)表示A状态为i,B状态为j,当前这个数的大因数给了B.

\(f1[dep][i|now_s][j]+=f1[dep-1][i][j]\)
\(f2[dep][i][j|now_s]+=f2[dep-1][i][j]\)

这个过程可以用滚动数组,或者从后往前更新来消除后效性.

处理完只有小因数的数(他们的大因数为0,排在前面)之后,我们用\(f1[i][j],f2[i][j]\)去更新\(dp[i][j]\)

\(dp[i][j]=f1[i][j]+f2[i][j]-dp[i][j]\)
(注意这不是一个方程qwq)

为什么后面要减去呢?因为我们现在是想综合当前这个大因数放到两个集合中的情况总和,加起来的话,前面\([i][j]\)的情况就算重了QAQ......然后每次在和后面的那个数的大因数不一样的时候就这样更新一下.就可以了.

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#define MAXN 255
using namespace std;
int n,mod;
int prime[8]={2,3,5,7,11,13,17,19};
long long ans;
long long dp[MAXN+10][MAXN+10],f1[MAXN+10][MAXN+10],f2[MAXN+10][MAXN+10];
struct Node{int op,s;}node[510];
inline bool cmp(Node x,Node y){return x.op<y.op;}
int main()
{#ifndef ONLINE_JUDGEfreopen("ce.in","r",stdin);// freopen("ce.out","w",stdout);#endifscanf("%d%d",&n,&mod);for(int i=2;i<=n;i++){int cur=i;for(int j=0;j<8;j++){if(cur%prime[j]==0){node[i].s|=(1<<j);while(cur&&cur%prime[j]==0) cur/=prime[j];}}node[i].op=cur;// printf("i=%d op=%d s=%d\n",i,node[i].op,node[i].s);}sort(&node[2],&node[n+1],cmp);dp[0][0]=f1[0][0]=f2[0][0]=1;for(int id=2;id<=n;id++){for(int i=MAXN;i>=0;i--)for(int j=MAXN;j>=0;j--){if((i&j)!=0) continue;if((j&node[id].s)==0) f1[i|node[id].s][j]=(f1[i|node[id].s][j]+f1[i][j])%mod;if((i&node[id].s)==0) f2[i][j|node[id].s]=(f2[i][j|node[id].s]+f2[i][j])%mod;}if(node[id].op==1||(node[id].op!=node[id+1].op)){// cout<<id<<endl;for(int i=0;i<=MAXN;i++)for(int j=0;j<=MAXN;j++)if((i&j)==0)dp[i][j]=(f1[i][j]+f2[i][j]+mod-dp[i][j])%mod;memcpy(f1,dp,sizeof(dp));memcpy(f2,dp,sizeof(dp));}}for(int i=0;i<=MAXN;i++)for(int j=0;j<=MAXN;j++)if((i&j)==0)ans=(ans+dp[i][j])%mod;printf("%lld\n",ans);return 0;
}

转载于:https://www.cnblogs.com/fengxunling/p/10947452.html

NOI2015 寿司晚宴相关推荐

  1. [NOI2015]寿司晚宴(状压dp)

    为了庆祝NOI的成功开幕,主办方为大家准备了一场寿司晚宴.小G和小W作为参加NOI的选手,也被邀请参加了寿司晚宴. 在晚宴上,主办方为大家提供了n−1种不同的寿司,编号1,2,3,⋯,n-1,其中第种 ...

  2. BZOJ4197: [Noi2015]寿司晚宴

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

  3. [NOI2015]寿司晚宴(状态压缩动态规划)

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

  4. BZOJ4197 [Noi2015]寿司晚宴 【状压dp】

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

  5. P2150 [NOI2015]寿司晚宴

    文章目录 ResultResultResult HyperlinkHyperlinkHyperlink DescriptionDescriptionDescription SolutionSoluti ...

  6. [NOI2015] 寿司晚宴(状压DP)

    洛谷题目传送门 解题思路 首先考虑30pts的做法 因为两人选的数必须互质,因此可以想到只要维护二者没有共同质因子就行了 因为质因子个数很少,考虑状压DP 设 dp[S][T] 表示 A选了数的质因子 ...

  7. NOI 2015 寿司晚宴

    4197: [Noi2015]寿司晚宴 Time Limit: 10 Sec Memory Limit: 512 MB Submit: 813 Solved: 508 [Submit][Status] ...

  8. Bzoj4197 寿司晚宴

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

  9. 周末狂欢赛4(1-02E. JM的西伯利亚特快专递,寿司晚宴,荷马史诗)

    文章目录 T1:1-02E. JM的西伯利亚特快专递 题目 题解 code T2:寿司晚宴 题目 题解 code T3:荷马史诗 题目 题解 code T1:1-02E. JM的西伯利亚特快专递 题目 ...

最新文章

  1. 百度启动高管退休计划,总裁张亚勤今年十月退休
  2. python创建矩阵行向量_python矩阵和向量的转置问题
  3. 今晚直播 | 清华大学​高天宇:对比学习及其在NLP中的应用
  4. 文件操作-读取文件内容
  5. JDK8下载|JDK1.8下载可选择window版和linux版
  6. python numba报错_python – 使用pip升级到numba 0.16会导致错误
  7. [02]基于webservice权限系统
  8. 类人猿手游内存技术教程
  9. 一元多次方程近似解法
  10. 这有清理C盘空间的妙招,学会了就不怕内存满了
  11. 免费空间(免备案,无广告) 1G免费全能空间
  12. 软件包管理:rpm和yum
  13. Ubuntu 开机慢的问题排查
  14. 【数字化转型的另类视角也许更务实】
  15. Windows驱动编程基础教程
  16. vue3的自定义指令directives
  17. Android平台简介
  18. 开启和关闭远程Windows系统3389端口
  19. 【大会信息分享】新一代推荐算法核心技术与实践
  20. 43.XDMA寄存器详解7-MSI-X Vector Table and PBA寄存器组剖析及MSI-X中断详解

热门文章

  1. JetBrains 是如何看待自己的软件在中国被频繁破解的?
  2. 友盟+又双叒叕得奖了!这次是爱分析·数据智能厂商全景报告
  3. 5G NR双激活协议栈(DAPS)~导入
  4. 这段视频火爆外网,谷歌把AI视频造假搞得太真太简单了
  5. 《Sibelius 脚本程序设计》配套录像(在线观看或下载)
  6. lol最克制诺手的英雄_lol怎么克制诺手_lol克制诺手的英雄有哪些_快吧游戏
  7. Zebra ZT410 ZT411 导入中文字体
  8. 关闭steam 广告!
  9. JAVA日期转换中文格式
  10. (转)强大的JQuery表单验证插件 FormValidator使用介绍