BZOJ 4197: [Noi2015]寿司晚宴 状压dp+质因数分解
挺神的一道题 ~
由于两个人选的数字不能有互质的情况,所以说对于一个质因子来说,如果 1 选了,则 2 不能选任何整除该质因子的数.
然后,我们发现对于 1 ~ 500 的数字来说,只可能有一个大于 $\sqrt 500$ 的质因子(两个的话乘积就超过 500 了)
而不大于 $\sqrt 500$ 的质因子总数只有 8 个,所以可以对这 8 个质因子状压.
我们先假设所有数字都 $\eqslant 30$,即所有质因子都 $leqslant \sqrt 500$.
定义状态 dp[i][j] 表示第一个人选的质因子集合为 $i$,第二个人选的质因子集合为 $j$.
那么直接更新 $dp[i|sta][j]+=dp[i][j]$ (sta 与 k 无交集)
对于第二个维度同理.
由于我们用滚动数组,所以还要定义 f1[i][j], f2[i][j] 表示第一个人/第二个人 和 第二个人/第一个人 状态下的方案数.
这个转移弄完之后,我们再考虑加入大于 $\sqrt 500$ 的质因子的情况:
令这个质因子为 $x$,那么会有一段数字都包含这个 $x$,显然这些数中只能让 1 个人去选择这个质因子.
我们沿用上面那个 f1[i][j], f2[i][j] 来更新,然后对于这一段的开始位置直接令 f1=f2=dp,其余的正常 dp。
处理完这段的时候还要减去两个数都不选的情况.
最后 dp'[i][j]=f1[i][j]+f2[i][j]-dp[i][j].
code:
#include <bits/stdc++.h>
#define N 703
#define LL long long
#define setIO(s) freopen(s".in","r",stdin)
using namespace std;
int n;
int poww[N];
LL ans,mod;
LL dp[N][N],f1[N][N],f2[N][N];
int p[13]={0,2,3,5,7,11,13,17,19,23};
struct data
{
int num,bi,sta;
}a[N];
bool cmp(data a,data b)
{
return a.bi<b.bi;
}
void init(int num)
{
int i,j,v=num,bi=0;
for(i=1;i<=8;++i)
{
if(v%p[i]==0)
{
a[num].sta|=poww[i];
while(v%p[i]==0) v/=p[i];
}
}
if(v>1) bi=v;
a[num].bi=bi;
a[num].num=num;
}
int main()
{
// setIO("input");
int i,j;
scanf("%d%lld",&n,&mod);
for(i=1;i<=12;++i) poww[i]=(1<<(i-1));
for(i=2;i<=n;++i) init(i);
sort(a+2,a+1+n,cmp);
dp[0][0]=1ll;
for(i=2;i<=n;++i)
{
if(i==2||!a[i].bi||a[i].bi!=a[i-1].bi)
{
memcpy(f1,dp,sizeof(dp));
memcpy(f2,dp,sizeof(dp));
}
for(j=255;j>=0;--j)
{
for(int k=255;k>=0;--k)
{
if((j&a[i].sta)==0) f1[j][k|a[i].sta]=(f1[j][k|a[i].sta]+f1[j][k])%mod;
if((k&a[i].sta)==0) f2[j|a[i].sta][k]=(f2[j|a[i].sta][k]+f2[j][k])%mod;
}
}
if(i==n||!a[i].bi||a[i].bi!=a[i+1].bi)
{
for(j=0;j<=255;++j)
{
for(int k=0;k<=255;++k)
{
dp[j][k]=(f1[j][k]+f2[j][k]-dp[j][k]+mod)%mod;
}
}
}
}
LL ans=0ll;
for(i=0;i<=255;++i) for(j=0;j<=255;++j) if((i&j)==0) (ans+=dp[i][j])%=mod;
printf("%lld\n",ans);
return 0;
}
BZOJ 4197: [Noi2015]寿司晚宴 状压dp+质因数分解的更多相关文章
- [NOI2015]寿司晚宴 --- 状压DP
[NOI2015]寿司晚宴 题目描述 为了庆祝NOI的成功开幕,主办方为大家准备了一场寿司晚宴. 小G和小W作为参加NOI的选手,也被邀请参加了寿司晚宴. 在晚宴上,主办方为大家提供了n−1种不同的寿 ...
- 【BZOJ4197】[Noi2015]寿司晚宴 状压DP+分解质因数
[BZOJ4197][Noi2015]寿司晚宴 Description 为了庆祝 NOI 的成功开幕,主办方为大家准备了一场寿司晚宴.小 G 和小 W 作为参加 NOI 的选手,也被邀请参加了寿司晚宴 ...
- B4197 [Noi2015]寿司晚宴 状压dp
这个题一开始想到了唯一分解定理,然后状压.但是显然数组开不下,后来想到每个数(n<500)大于19的素因子只可能有一个,所以直接单独存就行了. 然后正常状压dp就很好搞了. 题干: Descri ...
- bzoj4197 [Noi2015]寿司晚宴——状压DP
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4197 首先,两个人选的数都互质可以看作是一个人选了一个数,就相当于选了一个质因数集合,另一个 ...
- [NOI2015][bzoj4197] 寿司晚宴 [状压dp+质因数]
题面 传送门 思路 首先,要让两个人选的数字全部互质,那么有一个显然的充要条件:甲选的数字的质因数集合和乙选的数字的质因数集合没有交集 30pt 这种情况下n<=30,也就是说可用的质数只有10 ...
- [NOI2015]寿司晚宴——状压dp
题目转化:将2~n的数分成两组,可以不选,使得这两组没有公共的质因子.求方案数. 选择了一个数,相当于选择了它的所有质因子. 30分: 发现,n<=30的时候,涉及到的质因子也就10个.2,3, ...
- BZOJ 4197 NOI 2015 寿司晚宴 状压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是给哪个 ...
- 【BZOJ-4197】寿司晚宴 状压DP
4197: [Noi2015]寿司晚宴 Time Limit: 10 Sec Memory Limit: 512 MBSubmit: 694 Solved: 440[Submit][Status] ...
随机推荐
- Bitnami配置域名访问
安装完成Bitnami后,需要执行以下命令将默认目录改为/wordpress: E:\Bitnami\wordpress-5.2.2-0\apps\wordpress\bnconfig.exe --a ...
- C#使用Autofac实现控制反转IoC和面向切面编程AOP
Autofac是一个.net下非常优秀,性能非常好的IOC容器(.net下效率最高的容器),加上AOP简直是如虎添翼.Autofac的AOP是通过Castle(也是一个容器)项目的核心部分实现的,名为 ...
- 设计模式-依赖倒置-Dependency Inversion Principle
依赖倒置原则: 一般来说我们认为作为底层基础框架的逻辑是不应该依赖于上层逻辑的, 所以我们设计软件时也经常是: 需求 - 上层逻辑(直接实现需求) - 发现需要固化的逻辑 - 开发底层模块 - 然后上 ...
- 学习笔记之Vim
Vim (text editor) - Wikipedia https://en.wikipedia.org/wiki/Vim_(text_editor) Vim (/vɪm/;[4] a contr ...
- JavaScript中setInterval函数应用常见问题之一(第一个参数不加引号与加引号的区别)
学过JavaScript 脚本语言的都应该接触过setInterval 函数.如何使用我想大家都知道,但是有时候对于刚刚接触JavaScript的朋友来讲,还是会在使用的时候碰到这样或那样的问题而感到 ...
- 结队编程--java实现
1.GitHub地址:https://github.com/caiyouling/Myapp 队友:钟小敏 GitHub地址:https://github.com/zhongxiao136/Myapp ...
- trackingjs+websocket+百度人脸识别API,实现人脸签到
在公司做了个年会的签到.抽奖系统.用java web做的,用公司的办公app扫二维码码即可签到,扫完码就在大屏幕上显示这个人的照片.之后领导让我改得高大上一点,用人脸识别来签到,就把扫二维码的步骤改成 ...
- js 动态创建 全局变量(转载)
转载来源 https://blog.csdn.net/stevenzhong900610/article/details/40857087 https://www.jb51.net/article/8 ...
- Justice(HDU6557+2018年吉林站+二进制)
题目链接 传送门 题意 给你\(n\)个数,每个数表示\(\frac{1}{2^{a_i}}\),要你把这\(n\)个数分为两堆,使得每堆的和都大于等于\(\frac{1}{2}\). 思路 首先我们 ...
- Codeforces Round #555 (Div. 3) F. Maximum Balanced Circle
F. Maximum Balanced Circle 题目链接 题意 给出\(n\)个数,现在要从中选出最多的数\(b_i,b_{i+1},\cdots,b_k\),将这些数连成一个环,要求两两相邻的 ...