正解:$dp$

解题报告:

传送门$QwQ$.

遇事不决写$dp$($bushi$.讲道理这题一看就感觉除了$dp$也没啥很好的算法能做了,于是考虑$dp$呗

先看部分分?$30pts$发现质因数个数贼少就考虑状压$dp$就完事鸭.

然后现在$100pts$,发现质因数个数太多就$GG$了.

但是这时候考虑显然每个数最多有一个$\geq \sqrt n$的质因数.

所以对质因数以$\sqrt n$为界分为两类,对大于等于$\sqrt n$的质因数$x$直接枚举,显然$x$的倍数只能放在一个集合中或不放,所以直接枚举这个$x$每次分别$dp$再合并起来就好.

具体来说,设$f_{i,j}$表示第一个人选的$\leq \sqrt n$的质因数集合为$i$,第二个选的为$j$的方案数.然后再设$g_{0/1,i,j}$为辅助$dp$数组,即枚举$x$的时候记录$x$的倍数不放到第二个集合/第一个集合的方案数.

然后注意下的是每次$g$转回$f$的时候递推式是$f_{i,j}=g_{0,i,j}+g_{1,i,j}-f_{i,j}$.就,因为两个$g$都会包含所有$x$的倍数都不选的情况,所以就要去重,发现重复的刚好是$f_{i,j}$,减去就好

$over$

嗷注意一个小细节就它是$n-1$个寿司,,,我开始调了半天没调出来$kk$

#include<bits/stdc++.h>
using namespace std;
#define fi first
#define sc second
#define il inline
#define gc getchar()
#define mp make_pair
#define int long long
#define P pair<int,int>
#define ri register int
#define rb register bool
#define rc register char
#define rp(i,x,y) for(ri i=x;i<=y;++i)
#define my(i,x,y) for(ri i=x;i>=y;--i) const int N=(<<)+,M=+;
int n,mod,sqt,f[N][N],g[][N][N],p[]={,,,,,,,},as,tot;
P nod[M]; il int read()
{
rc ch=gc;ri x=;rb y=;
while(ch!='-' && (ch>'' || ch<''))ch=gc;
if(ch=='-')ch=gc,y=;
while(ch>='' && ch<='')x=(x<<)+(x<<)+(ch^''),ch=gc;
return y?x:-x;
}
il void ad(ri &x,ri y){x+=y;if(x>=mod)x-=mod;} signed main()
{
//freopen("2150.in","r",stdin);freopen("2150.out","w",stdout);
n=read();mod=read();sqt=sqrt(n+);
rp(i,,n)
{ri nw=i;rp(j,,)if(!(nw%p[j])){nod[i].sc|=(<<j);while(!(nw%p[j]))nw/=p[j];}nod[i].fi=nw;}
sort(nod+,nod+n+);tot=(<<)-;f[][]=g[][][]=g[][][]=;
rp(i,,n)
{
my(j,tot,)
my(k,tot,)
{
if(j&k)continue;
if(!(j&nod[i].sc))ad(g[][j][k|nod[i].sc],g[][j][k]);
if(!(k&nod[i].sc))ad(g[][j|nod[i].sc][k],g[][j][k]);
}
if(nod[i].fi== || nod[i].fi^nod[i+].fi)
{
rp(j,,tot)rp(k,,tot)if(!(j&k))f[j][k]=(g[][j][k]+g[][j][k]-f[j][k])%mod,ad(f[j][k],mod);
memcpy(g[],f,sizeof(g[]));memcpy(g[],f,sizeof(g[]));
}
}
rp(i,,tot)rp(j,,tot)if(!(i&j))ad(as,f[i][j]);printf("%lld\n",as);
return ;
}

洛谷$P2150\ [NOI2015]$寿司晚宴 $dp$的更多相关文章

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

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

  2. p2150 [NOI2015]寿司晚宴

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

  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 寿司晚宴

    解:发现每个质数只能属于一个人,于是想到每个质数有三种情况:属于a,属于b,都不属于. 然后考虑状压每个人的质数集合,可以得到30分. 转移就是外层枚举每个数,内层枚举每个人的状态,然后看能否转移.能 ...

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

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

  6. BZOJ4197[NOI2005]寿司晚宴

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

  7. HYSBZ 4197 寿司晚宴

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

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

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

  9. NOI2015 寿司晚宴

    今年NOI确实是在下输了.最近想把当时不会做的题都写一下. 题意 从2到n(500)这些数字中,选若干分给A,若干分给B,满足不存在:A的某个数和B的某个数的GCD不等于1. 对于寿司晚宴这题,标准解 ...

随机推荐

  1. @loj - 2093@ 「ZJOI2016」线段树

    目录 @description@ @solution@ @accepted code@ @details@ @description@ 小 Yuuka 遇到了一个题目:有一个序列 a1,a2,..., ...

  2. 利用伪类选择器与better-scroll的on事件所完成的上拉加载

    之前给大家分享过一篇上拉加载 利用了better-scroll的pullUpDown 和DOM元素的删除添加  感觉那样不太好 今天给大家分享一个不同的上拉加载思想 代码如下 class List { ...

  3. html--图片img

    一.图片的基本格式 当前万维网上流行的图像格式以GIF及JPEG为主,另外还有一个PNG.以下做分别介绍: 1.GIF格式:采用LZW压缩,是以压缩相同颜色的色块来减少图像大小的.(LZW压缩是一种能 ...

  4. 给tomcat容器配置SSL的记录,包含项目完整部署过程

    给tomcat容器配置SSL(https) 昨天公司有一个旧的项目要部署, 服务器(OS是windows 10) 数据库都是新买的, 写个博客记录一下 1, 下载证书(以阿里云为例子) 参考链接: h ...

  5. html前端登录验证

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  6. 横向tab计算滚动位置

    React横向滚动计算 class Footer extends React.Component { handleClick(e) { const offset = 150; // 指定偏移量 thi ...

  7. ERROR 1366 (HY000): Incorrect string value: '\xD5\xC5\xC8\xFD' for column 'name' at row 1

    ERROR 1366 (HY000): Incorrect string value: '\xD5\xC5\xC8\xFD' for column 'name'  at row 1   数据库字符集问 ...

  8. JPA一对多循环引用的解决&&JackSon无限递归问题

    说是解决,其实不是很完美的解决的,写出来只是想记录一下这个问题或者看一下有没有哪位仁兄会的,能否知道一二. 下面说说出现问题: 问题是这样的,当我查询一个一对多的实体的时候,工具直接就爆了,差不多我就 ...

  9. python基础十一之迭代器和生成器

    可迭代 内置方法中含有__iter__的数据类型都是可迭代的,只要是可迭代的就可以使用for循环,反之亦然. print(dir('')) # dir()函数可以获取当前数据类型的所有内置方法 返回值 ...

  10. Acegi框架介绍

    开发四年只会写业务代码,分布式高并发都不会还做程序员?->>>        概述     对于任何一个完整的应用系 统,完善的认证和授权机制是必不可少的.Acegi Securit ...