文章目录

  • ResultResultResult
  • HyperlinkHyperlinkHyperlink
  • DescriptionDescriptionDescription
  • SolutionSolutionSolution
  • CodeCodeCode

ResultResultResult


HyperlinkHyperlinkHyperlink

https://www.luogu.com.cn/problem/P2150


DescriptionDescriptionDescription

有n−1n-1n−1个数,它们是在[2,n][2,n][2,n]范围内的正整数
现在试着从中选出若干个数,并分为两个集合A,BA,BA,B,要求AAA中的任何一个元素和BBB中的任何一种元素都没有公因数
问方案数

数据范围:
n≤500,p≤1010n\leq 500,p\leq 10^{10}n≤500,p≤1010


SolutionSolutionSolution

转化题意,我们对[2,n][2,n][2,n]的每个数分解质因数,问题转化成为选出两个集合不含相同的质因数
显然我们可以状压这些质因数,但貌似个数太多了?
容易发现,大于n\sqrt nn​的质因数至多只有一个,小于n\sqrt nn​的至多有8个,所以我们可以对其分块
将iii大于n\sqrt nn​的质因数记为bigibig_ibigi​,对bigibig_ibigi​相同的数统一转移(这些数至多只能选一个)

则设f[i][j][k]f[i][j][k]f[i][j][k]表示选到第iii个数,AAA集合选取前八个质因子的状态为jjj,BBB集合选取前八个质因子的状态为kkk,显然第一维可以滚动掉
考虑对bigbigbig的情况进行处理,设g[0/1][j][k]g[0/1][j][k]g[0/1][j][k]表示AAA集合选取前八个质因子状态为jjj,BBB集合选取前八个质因子的状态为kkk,bigbigbig被A/BA/BA/B选取的方案数
当k&a[i].S==0k\&a[i].S==0k&a[i].S==0时有转移g[0][j∣a[i].S][k]+=g[0][j][k]g[0][j|a[i].S][k]+=g[0][j][k]g[0][j∣a[i].S][k]+=g[0][j][k],表示如果BBB集合中完全没有aia_iai​含有的质因子集合,则AAA集合可以选取它
当j&a[i].S==0j\&a[i].S==0j&a[i].S==0时有转移g[1][j][k∣a[i].S]+=g[1][j][k]g[1][j][k|a[i].S]+=g[1][j][k]g[1][j][k∣a[i].S]+=g[1][j][k],表示如果AAA集合中完全没有aia_iai​含有的质因子集合,则BBB集合可以选取它

则f=g[0]+g[1]−ff=g[0]+g[1]-ff=g[0]+g[1]−f,减的原因是上述转移同时减去了A,BA,BA,B都不选取bigbigbig的情况

g=fg=fg=f(初始化)当且仅当位于一个块的开始(我们已经对aia_iai​按照bigbigbig分块)
从ggg转移到fff当且仅当位于一个块的结束

时间复杂度:
O(216n)O(2^{16}n)O(216n)


CodeCodeCode

#include<cctype>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define MAXN 256
#define LL long long
using namespace std;int n;
const int p[8]={2,3,5,7,11,13,17,19};
LL mod,f[MAXN][MAXN],g[2][MAXN][MAXN],res;
struct node{int big,S;}a[510];
inline bool cmp(node x,node y){return x.big>y.big;}
inline LL read()
{char c;LL d=1,f=0;while(c=getchar(),!isdigit(c)) if(c=='-') d=-1;f=(f<<3)+(f<<1)+c-48;while(c=getchar(),isdigit(c)) f=(f<<3)+(f<<1)+c-48;return d*f;
}
signed main()
{n=read();mod=read();for(register int i=1;i<n;i++){int tmp=i+1;for(register int j=0;j<8&&tmp>=p[j];j++)//质因数分解if(tmp%p[j]==0){a[i].S|=1<<j;do{tmp/=p[j];}while(tmp%p[j]==0);}a[i].big=tmp;//记录}sort(a+1,a+n,cmp);//按照big分块f[0][0]=1;for(register int i=1;i<n;i++){if(i==1||a[i].big!=a[i-1].big||a[i].big==1)//位于一个块的开始{memcpy(g[0],f,sizeof(f));memcpy(g[1],f,sizeof(f));}for(register int j=MAXN-1;j>=0;j--)for(register int k=MAXN-1;k>=0;k--)//倒序循环,因为是滚动数组{if(j&k) continue;if((k&a[i].S)==0) (g[0][j|a[i].S][k]+=g[0][j][k])%=mod;if((j&a[i].S)==0) (g[1][j][k|a[i].S]+=g[1][j][k])%=mod;}if(i==n-1||a[i].big!=a[i+1].big||a[i].big==1)//位于一个块的结束{for(register int j=0;j<MAXN;j++)for(register int k=0;k<MAXN;k++){if(j&k) continue;f[j][k]=(g[0][j][k]+g[1][j][k]-f[j][k]+mod)%mod;}} }for(register int j=0;j<MAXN;j++)for(register int k=0;k<MAXN;k++){if(j&k) continue;(res+=f[j][k])%=mod;//统计答案}printf("%lld",res);
}

P2150 [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. NOI2015 寿司晚宴

    题目链接:戳我 30pts还是很好写的,因为30以内的质因数就没有几个,直接状压就可以了. 但是如果范围扩大到500呢?我们考虑后面的数怎么处理. 首先观察到19之后的数最多只能出现一次,那么我们直接 ...

  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. Xamarin Android项目真机测试闪退
  2. mysql子查询设置_什么是mysql子查询?如何利用子查询进行过滤?
  3. Python看程序执行时间(time模块)
  4. Kafka、ActiveMQ、RabbitMQ、RocketMQ 区别以及高可用原理
  5. 使用git命令提交代码到Github远程仓库的方法
  6. (转)找回vss超级管理员密码
  7. mysql连接代替子查询_MySQL优化之使用连接(join)代替子查询
  8. Linux关于Sendmail配置错误的问题
  9. 【NOIP2010】【Luogu1540】机器翻译
  10. 最短路径和最小生成树的区别
  11. 【信息安全导论】HIT2022春季学期《信息安全导论》复习概要
  12. java fakepath_IE浏览器上传文件时本地路径变成”C:\fakepath\”的问题
  13. 代收邮件服务器(pop,接收邮件服务器(POP)是?什么是 POP3? POP3 命令包括什么?
  14. html中搜索框提示语,请输入您要搜索的内容(自定义Win10搜索框提示语的技巧)...
  15. 乔治城大学计算机科学硕士2019,乔治城大学2019THE世界大学排名最新排名第109
  16. UiPath认证流程
  17. 川大计算机学院周激流,周激流(电子信息学院)老师 - 四川大学 - 院校大全
  18. CTFshow新春欢乐赛--web6--反序列化字符串逃逸
  19. 你绝对没见过的船新版本,利用Python代码制作过年春联。
  20. Python-延时操作

热门文章

  1. 什么是lims系统,lims(实验室管理系统)
  2. 基于vue和nodejs毕业设计电影购票微信小程序影院
  3. ubyntu 链接mysql_ubuntu下mysql连接(转载)
  4. 【ZZULIOJ】1055: 兔子繁殖问题
  5. 黑马JavaWeb全功能综合案例(element-ui+mybatis+Vue+ajax)
  6. Lambda与Stream流
  7. 第5组UI 让你的界面酷炫到底-ViewAniMator之ViewSwitcher、ImageSwitcher(图像切换器)、TextSwitcher(文本切换器)、ViewFlipper
  8. 测试适合染发颜色的软件,5秒测出你适合染什么颜色的头发!准到爆!
  9. 禅道开源版16.2,解决LDAP插件无法使用的问题
  10. Google Spanner原理:地球上最大的单一数据库