题目传送门


分析

最小公倍数最终一定会被表示成若干个质数指数幂的情况(1的情况就直接乘上二的次幂)

然后每个数的加入相当于对每个质数的指数取最大值,但是如果将每个质数的次数都表示出来状态数很多,

考虑根号分治,只将 \(2,3,5,7,11,13,17\) 的情况处理出来,然后之后的质数幂次直接滚动数组就可以了。


代码

#include <cstdio>
#include <cctype>
#include <cstring>
#include <algorithm>
using namespace std;
const int N=301,mx[7]={9,6,4,3,3,3,3};
const int prime[62]={2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59,61,67,71,73,79,83,89,97,101,103,107,109,113,127,131,137,139,149,151,157,163,167,173,179,181,191,193,197,199,211,223,227,229,233,239,241,251,257,263,269,271,277,281,283,293};
int n,mod,ans,tot,c[N],a[N][7],b[N],o,rk[N],pw[7][9],p[7],_p[7],two[300011],dp[2][2][9][6][4][3][3][3][3],f[2][9][6][4][3][3][3][3];
int iut(){
int ans=0; char c=getchar();
while (!isdigit(c)) c=getchar();
while (isdigit(c)) ans=ans*10+c-48,c=getchar();
return ans;
}
int max(int a,int b){return a>b?a:b;}
void Mo(int &x,int y){x=x+y>=mod?x+y-mod:x+y;}
bool cmp(int x,int y){return b[x]<b[y];}
int main(){
n=iut(),mod=iut(),two[0]=1;
for (int i=0;i<7;++i){
pw[i][0]=1;
for (int j=1;j<mx[i];++j)
pw[i][j]=1ll*pw[i][j-1]*prime[i]%mod;
}
for (int i=1;i<=n;++i) ++c[iut()],two[i]=(two[i-1]+two[i-1])%mod;
for (int i=2;i<N;++i) if (c[i]) rk[++tot]=i;
for (int i=0;i<62;++i){
for (int j=prime[i];j<N;j+=prime[i])
if (c[j]){
int CNT=0;
for (int x=j;x%prime[i]==0;x/=prime[i],++CNT);
if (i<7) a[j][i]=CNT;
else b[j]=i;
}
}
sort(rk+1,rk+1+tot,cmp),f[0][0][0][0][0][0][0][0]=1;
for (int l=1,r;l<=tot;l=r+1){
for (r=l;r<=tot&&b[rk[r]]==b[rk[l]];++r); --r;
if (l==1&&b[rk[1]]) dp[0][0][0][0][0][0][0][0][0]=1;
if (b[rk[l]]){
for (int i=l;i<=r;++i){
if (!c[rk[i]]) continue;
int t=two[c[rk[i]]]-1;
o^=1,memcpy(dp[o],dp[o^1],sizeof(dp[o]));
for (int j=0;j<7;++j) p[j]=0;
for (int g=0;!g;){
for (int j=0;j<7;++j) _p[j]=max(p[j],a[rk[i]][j]);
int t0=1ll*dp[o^1][0][p[0]][p[1]][p[2]][p[3]][p[4]][p[5]][p[6]]*t%mod;
int t1=1ll*dp[o^1][1][p[0]][p[1]][p[2]][p[3]][p[4]][p[5]][p[6]]*t%mod;
Mo(dp[o][1][_p[0]][_p[1]][_p[2]][_p[3]][_p[4]][_p[5]][_p[6]],t0+t1>=mod?t0+t1-mod:t0+t1);
g=1;
for (int j=6;g&&~j;--j)
p[j]+=g,g=p[j]/mx[j],p[j]%=mx[j];
}
}
for (int j=0;j<7;++j) p[j]=0;
for (int g=0;!g;){
int &t=dp[o][1][p[0]][p[1]][p[2]][p[3]][p[4]][p[5]][p[6]];
Mo(dp[o][0][p[0]][p[1]][p[2]][p[3]][p[4]][p[5]][p[6]],1ll*t*prime[b[rk[l]]]%mod),t=0;
g=1;
for (int j=6;g&&~j;--j)
p[j]+=g,g=p[j]/mx[j],p[j]%=mx[j];
}
}else{
for (int i=l;i<=r;++i){
if (!c[rk[i]]) continue;
int t=two[c[rk[i]]]-1;
o^=1,memcpy(f[o],f[o^1],sizeof(f[o]));
for (int j=0;j<7;++j) p[j]=0;
for (int g=0;!g;){
int now=1ll*f[o^1][p[0]][p[1]][p[2]][p[3]][p[4]][p[5]][p[6]]*t%mod;
if (now){
for (int j=0;j<7;++j) _p[j]=max(p[j],a[rk[i]][j]);
Mo(f[o][_p[0]][_p[1]][_p[2]][_p[3]][_p[4]][_p[5]][_p[6]],now);
}
g=1;
for (int j=6;g&&~j;--j)
p[j]+=g,g=p[j]/mx[j],p[j]%=mx[j];
}
}
}
if (l==1&&!b[rk[1]]){
for (int j=0;j<7;++j) p[j]=0;
for (int g=0;!g;){
dp[0][0][p[0]][p[1]][p[2]][p[3]][p[4]][p[5]][p[6]]=f[o][p[0]][p[1]][p[2]][p[3]][p[4]][p[5]][p[6]];
g=1;
for (int j=6;g&&~j;--j)
p[j]+=g,g=p[j]/mx[j],p[j]%=mx[j];
}
o=0;
}
}
for (int j=0;j<7;++j) p[j]=0;
for (int g=0;!g;){
int t=1ll*pw[0][p[0]]*pw[1][p[1]]*pw[2][p[2]]*pw[3][p[3]]%mod*pw[4][p[4]]*pw[5][p[5]]*pw[6][p[6]]%mod;
Mo(ans,1ll*dp[o][0][p[0]][p[1]][p[2]][p[3]][p[4]][p[5]][p[6]]*t%mod);
g=1;
for (int j=6;g&&~j;--j)
p[j]+=g,g=p[j]/mx[j],p[j]%=mx[j];
}
return !printf("%lld",1ll*ans*two[c[1]]%mod);
}

#根号分治,动态规划#洛谷 5616 [MtOI2019]恶魔之树的更多相关文章

  1. 动态规划 洛谷P1616 疯狂的采药

    动态规划 洛谷P1616 疯狂的采药 同样也是洛谷的动态规划一个普及-的题目,接下来分享一下我做题代码 看到题目,没很认真的看数据大小,我就提交了我的代码: 1 //动态规划 洛谷P1616 疯狂的采 ...

  2. 动态规划 洛谷P1048 [NOIP2005 普及组] 采药

    洛谷P1048 [NOIP2005 普及组] 采药 洛谷的一个谱架-的题目,考的是01背包问题,接下来分享一下我的题解代码. AC通过图: 我的代码: 1 //动态规划 洛谷P1048 [NOIP20 ...

  3. 动态规划 洛谷P4017 最大食物链计数——图上动态规划 拓扑排序

    洛谷P4017 最大食物链计数 这是洛谷一题普及/提高-的题目,也是我第一次做的一题 图上动态规划/拓扑排序 ,我认为这题是很好的学习拓扑排序的题目. 在这题中,我学到了几个名词,入度,出度,及没有环 ...

  4. 洛谷 P3384 【模板】树链剖分-树链剖分(点权)(路径节点更新、路径求和、子树节点更新、子树求和)模板-备注结合一下以前写的题目,懒得写很详细的注释

    P3384 [模板]树链剖分 题目描述 如题,已知一棵包含N个结点的树(连通且无环),每个节点上包含一个数值,需要支持以下操作: 操作1: 格式: 1 x y z 表示将树从x到y结点最短路径上所有节 ...

  5. 洛谷p3384【模板】树链剖分题解

    洛谷p3384 [模板]树链剖分错误记录 首先感谢\(lfd\)在课上调了出来\(Orz\) \(1\).以后少写全局变量 \(2\).线段树递归的时候最好把左右区间一起传 \(3\).写\(dfs\ ...

  6. 点分治模板(洛谷P4178 Tree)(树分治,树的重心,容斥原理)

    推荐YCB的总结 推荐你谷ysn等巨佬的详细题解 大致流程-- dfs求出当前树的重心 对当前树内经过重心的路径统计答案(一条路径由两条由重心到其它点的子路径合并而成) 容斥减去不合法情况(两条子路径 ...

  7. 洛谷 P5518 - [MtOI2019]幽灵乐团 / 莫比乌斯反演基础练习题(莫比乌斯反演+整除分块)

    洛谷题面传送门 一道究极恶心的毒瘤六合一题,式子推了我满满两面 A4 纸-- 首先我们可以将式子拆成: \[ans=\prod\limits_{i=1}^A\prod\limits_{j=1}^B\p ...

  8. 洛谷 P3384 【模板】树链剖分

    树链剖分 将一棵树的每个节点到它所有子节点中子树和(所包含的点的个数)最大的那个子节点的这条边标记为"重边". 将其他的边标记为"轻边". 若果一个非根节点的子 ...

  9. 洛谷P3459 [POI2007]MEG-Megalopolis(树链剖分,Splay)

    洛谷题目传送门 正解是树状数组维护dfn序上的前缀和,这样的思路真是又玄学又令我惊叹( 我太弱啦,根本想不到)Orz各路Dalao 今天考了这道题,数据范围还比洛谷的小,只有\(10^5\)(害我复制 ...

  10. [洛谷P1198/BZOJ1012][JSOI2008] 最大数 - 树状数组/线段树?

    其实已经学了树状数组和线段树,然而懒得做题,所以至今没写多少博客 Description 现在请求你维护一个数列,要求提供以下两种操作: 1. 查询操作. 语法:Q L 功能:查询当前数列中末尾L个数 ...

随机推荐

  1. C# EnumWindows示例代码

    代码开箱即用,唯一需要处理的就是要提供一个进程的pid. using System; using System.Collections.Generic; using System.Linq; usin ...

  2. 串口通信RXTXcomm使用

    一.串口通信原理 串口通信(Serial Communications)的概念非常简单,串口按位(bit)发送和接收字节. 尽管比按字节(byte)的并行通信慢,但是串口可以在使用一根线发送数据的同时 ...

  3. 硬件开发笔记(十二):RK3568底板电路电源模块和RTC模块原理图分析

    前言   做硬件做系统做驱动,很难从核心板做起,所以我们先依赖核心板,分析底板周围的电路,然后使用AD绘制原理图和设计PCB,打样我司测试底板,完成硬件测试,再继续系统适配,驱动移植,从而一步一步完善 ...

  4. .net core6 Autofac依赖注入

    一.引言 .net core6在文件方面是精简了,所以配置方面也发生了部分变化:下面记录下.net core6中怎么配置Autofac 进行依赖注入. 二.项目创建 1).首先引用两个包:在Nuget ...

  5. 【Azure 环境】Windows中安装Python azure-eventhub-checkpointstoreblob-aio模块时出错 ERROR: Could not install packages due to an EnvironmentError: [Errno 2] No such file or directory:

    问题描述 在使用Python代码接受EventHub的消息时,根据文档要求安装azure-eventhub-checkpointstoreblob-aio模块时,出现了如下错误: ERROR: Cou ...

  6. 【Azure Developer】Springboot 集成 中国区的Key Vault 报错 AADSTS90002: Tenant 'xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx' not found

    问题描述 Springboot 集成azure keyvault 报错,代码参考的官方文档:https://docs.microsoft.com/en-us/azure/developer/java/ ...

  7. 【Azure Spring Cloud】Azure Spring Cloud connect to SQL using MSI

    问题描述 在Azure Spring Cloud中,通过ActiveDirectoryMSI方式来连接到SQL Service,需要如何配置呢? 问题分析 在SQL Service中启用Active ...

  8. 如何实现十亿级离线 CSV 导入 Nebula Graph

    本文首发于 Nebula Graph Community 公众号 本次实践是基于业务需求及后续扩展,通过技术选型确定了 Nebula Graph 图数据库,首先需要验证 Nebula Graph 数据 ...

  9. 影刀rpa:关于if单条件切换到多条件时的不便之处

    现有需求,只判断一个条件是否满足即可,但随着后续业务开发,这里得if就需要判断多个条件,此时要是想将if单条件改为多条件的话,就得先拉一个if多条件的指令,然后再将if单条件中的语句全部移动到if多条 ...

  10. 【苹果】SpringBoot监听Iphone15邮件提醒,Selenium+Python自动化抢购脚本

    前言 缘由 Iphone15来了,两年之约你还记得吗? 遂整合之前iphone13及iphone14的相关抢购代码,完成一个SpringBoot监听Iphone15有货邮件提醒+python自动化脚本 ...