【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. POJ-3273(二分)

    //题意:给出农夫在n天中每天的花费,要求把这n天分作m组, //每组的天数必然是连续的,要求分得各组的花费之和应该尽可能地小,最后输出各组花费之和中的最大值. //思路:看到各组最小和最大的,果断上 ...

  2. oracle查询数据库所有用户信息

    看到网上说的查询用户的语句: SELECT * FROM dba_users;这句好像只能系统管理员才能成功执行,普通用户无法执行 SELECT count(*) FROM all_users; , ...

  3. 在GPT格式的硬盘上,使用EFI启动的方式,安装Win7 64位系统

    Win7 sp1 原装系统,用UltraISO(软碟通) 把U 盘制成Win7 安装的启动U盘 将bootmgfw.efi和shell.efi 加到已制好启动U盘的根目录,并在efi/boot/路径下 ...

  4. 20181016-4 Alpha阶段第1周/共2周 Scrum立会报告+燃尽图 02

    此次作业要求参见 [https://edu.cnblogs.com/campus/nenu/2018fall/homework/2247] Scrum master:祁玉 一.小组介绍 组长:王一可 ...

  5. 20172305 2018-2019-1 《Java软件结构与数据结构》第八周学习总结

    20172305 2018-2019-1 <Java软件结构与数据结构>第八周学习总结 教材学习内容总结 本周内容主要为书第十二章内容: 堆(附加属性的二叉树) 完全二叉树 (最小堆)对于 ...

  6. MySort试验记录

    MySort试验记录 编写目标 结果代码 思路 将数组每一个项目的第三组数字抽出来并且排序成12345的顺序,并形成新数组k3. 把原数组的每一项与k3进行比较,每符合一项便输出一项,从而重新排序出新 ...

  7. eclipse连接SQL2008R2

    最近又开始写JAVA WEB了,想起连接数据库就麻烦,但是通过一天的努力我居然弄好了,很有成就感. 我用的是 SQL Server 2008 R2  +  eclipse 首先要成功的安装好SQL最终 ...

  8. OpenCV学习笔记——腐蚀与膨胀

    1.膨胀 此操作将图像 与任意形状的内核 (),通常为正方形或圆形,进行卷积. 内核 有一个可定义的 锚点, 通常定义为内核中心点. 进行膨胀操作时,将内核 划过图像,将内核 覆盖区域的最大相素值提取 ...

  9. alpha6/10

    队名:Boy Next Door 燃尽图 晗(组长) 今日完成 学习了css的一些基本操作. 明日工作 抽空把javascript的基本操作学习一下 还剩下哪些任务 微信API还有京东钱包的API. ...

  10. MySQL的并发访问控制(锁)

    前言:任何的数据集只要支持并发访问模型就必须基于锁机制进行访问控制 锁种类 读锁:共享锁,允许给其他人读,不允许他人写写锁:独占锁, 不允许其他人读和写 锁类型 显示锁:用户手动请求读锁或写锁隐式锁: ...