【BZOJ4197】【NOI2015】寿司晚宴(动态规划)

题面

BZOJ

从\([2,n]\)中选择两个集合(可以为空集),使得两个集合中各选一个数出来,都互质。

求方案数。

题解

对于\(500\)以内的所有数,它的最大质因子如果大于\(\sqrt n\),那么便只有一个。

利用这一点,我们把所有数全部用小于\(\sqrt n\)的质数来分解。

最后剩下的结果一定是一个\(\gt \sqrt n\)的质数或者\(1\),再乘上\(\le \sqrt n\)的质数。

小于\(\sqrt n\)的质数很少,只有\(8\)个,可以按照这个进行状压。

显然,拥有大于\(\sqrt n\)质因数的所有数可以归结为一类,并且他们只能一起放在一个集合中。

所以考虑状态\(f[i][j]\)表示第一个人选择了质因数集合\(i\),第二个人选择了\(j\)

因为大于\(\sqrt n\)的质因数放在一起考虑,所以不将他压进状态。

我们再枚举这个质因数放进哪个集合就好了,这个可以再诶外开数组维护。

当这个质因数的所有数都考虑完了之后,

当前的贡献就是\(f[i][j]=g[0][i][j]+g[1][i][j]-f[i][j]\)

其中\(g\)数组表示把当前这个质因数给了第一个人还是第二个人,后面两维意义和\(f\)相同的方案数。

因为\(f[i][j]\)是前面所有其他质因子的答案,当前在求和的时候存在没有将当前质因子的任何一个数放进任意一个集合,所以这里会被算两遍,把它减掉就好了。

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
#define ll long long
int n,MOD,ans;
void add(int &x,int y){x+=y;if(x>=MOD)x-=MOD;}
int f[1<<8][1<<8],g[2][1<<8][1<<8];
int p[8]={2,3,5,7,11,13,17,19};
pair<int,int> a[505];
int main()
{
scanf("%d%d",&n,&MOD);
for(int i=2;i<=n;++i)
{
int x=i;
for(int j=0;j<8;++j)
while(x%p[j]==0)x/=p[j],a[i].second|=1<<j;
a[i].first=x;
}
sort(&a[2],&a[n+1]);f[0][0]=g[0][0][0]=g[1][0][0]=1;
for(int z=2;z<=n;++z)
{
for(int x=255;~x;--x)
for(int y=255;~y;--y)
if(!(x&y))
{
if(!(y&a[z].second))add(g[0][x|a[z].second][y],g[0][x][y]);
if(!(x&a[z].second))add(g[1][x][y|a[z].second],g[1][x][y]);
}
if(a[z].first==1||a[z].first!=a[z+1].first)
{
for(int i=0;i<1<<8;++i)
for(int j=0;j<1<<8;++j)
if(!(i&j))f[i][j]=(g[0][i][j]+g[1][i][j]-f[i][j])%MOD,add(f[i][j],MOD);
memcpy(g[0],f,sizeof(g[0]));memcpy(g[1],f,sizeof(g[1]));
}
}
for(int i=0;i<1<<8;++i)
for(int j=0;j<1<<8;++j)
if(!(i&j))add(ans,f[i][j]);
printf("%d\n",ans);
return 0;
}

【BZOJ4197】【NOI2015】寿司晚宴(动态规划)的更多相关文章

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

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

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

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

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

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

  4. bzoj4197 [Noi2015]寿司晚宴——状压DP

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4197 首先,两个人选的数都互质可以看作是一个人选了一个数,就相当于选了一个质因数集合,另一个 ...

  5. BZOJ_4197_[Noi2015]寿司晚宴_状态压缩动态规划

    BZOJ_4197_[Noi2015]寿司晚宴_状态压缩动态规划 Description 为了庆祝 NOI 的成功开幕,主办方为大家准备了一场寿司晚宴.小 G 和小 W 作为参加 NOI 的选手,也被 ...

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

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

  7. 【BZOJ-4197】寿司晚宴 状压DP

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

  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]寿司晚宴 --- 状压DP

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

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

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

随机推荐

  1. 利用Anaconda进行python爬虫环境的配置-安装scrapy

    1.下载Anaconda,下载地址:https://www.continuum.io/downloads 2.安装anaconda. 3.安装scrapy

  2. Spring中的TransactionProxyFactoryBean作用及配置(转)

    问: 原文链接 http://blog.csdn.net/cpp_lzth/article/details/6551703 看AOP的时候发现spring中有个org.springframework. ...

  3. centos7下python3与python2共存并且开启py3虚拟环境

    因为下载视频需要用到python3环境,今天在我的win上安装下载工具死活安装不上去,在大盘鸡上一下就安装成功了...可能在win上不兼容吧...无奈只能在大盘鸡上进行折腾了,顺便几个笔记 由于大盘鸡 ...

  4. equals和==方法比较(二)--Long中equals源码分析

    接上篇,分析equals方法在Long包装类中的重写,其他类及我们自定义的类,同样可以根据需要重新equals方法. equals方法定义 equals方法是Object类中的方法,java中所有的对 ...

  5. 使用performance进行前端性能监控

    该文章仅作为自己的总结 1.performance.timing对象 navigationStart:当前浏览器窗口的前一个网页关闭,发生unload事件时的Unix毫秒时间戳.如果没有前一个网页,则 ...

  6. gevent协程、select IO多路复用、socketserver模块 改造多用户FTP程序例子

    原多线程版FTP程序:http://www.cnblogs.com/linzetong/p/8290378.html 只需要在原来的代码基础上稍作修改: 一.gevent协程版本 1. 导入geven ...

  7. redis与mysql性能对比、redis缓存穿透、缓存雪崩

    写在开始 redis是一个基于内存hash结构的缓存型db.其优势在于速读写能力碾压mysql.由于其为基于内存的db所以存储数据量是受限的. redis性能 redis读写性能测试redis官网测试 ...

  8. sqlserver-查阻塞

    模拟阻塞: 打开两个窗口:     窗口一: BEGIN TRANSACTION--开始事务 --等待1分钟 WAITFOR DELAY '00:1'; 窗口二: 查询阻塞:(当前被阻塞的进程id,不 ...

  9. 用了这么多年的MCU,你知道哪些MCU原厂最牛?

    单片机诞生于1971年,经历了SCM.MCU.SoC三大阶段.单片机由以前的1位.4位.8位.16位,发展到现在的32位甚至64位. 90年代后随着消费电子产品大发展,单片机技术得到了巨大提高,相继诞 ...

  10. $_SERVER的详细参数整理下

    PHP编程中经常需要用到一些服务器的一些资料,特把$_SERVER的详细参数整理下,方便以后使用. $_SERVER['PHP_SELF'] #当前正在执行 脚本的文件名,与 document roo ...