记录$lcm$的质因子状态(包括大于$\sqrt 300$的质因子),设$f[s]$表示质因子状态为$s$的$lcm$之和,转移枚举当前的数$k$,转移到$lcm(s,k)$即可,时间复杂度为$o(n\cdot |stats|)$($|stats|$会非常大)

优化1:对于一个$k$,有$2^{cnt}-1$种方案转移到$lcm(s,k)$($cnt$为$k$出现次数),而$k$最多300个,因此时间复杂度降为$o(300\cdot |stats|)$

优化2:对于一个$k$,我们只关心$k$所含有的质因子,也就是说设令$g[s]=\sum_{s\in s'}f[s']$(理解一下,$s$中仅表示2,3,5,7,11,13,17以及$k$中含有的大质数,$s'$表示全部状态,$s\in s'$即在$s$考虑的质数与$s'$对应的质数状态相同),那么可以直接在$g$上转移

答案即求$\sum_{s}f[s]$,由于对于19即以上的质因子,同一个数$k$不可能同时存在2个/种,因此从小到大枚举质因子,再枚举含有该质因子的数,对于已经其余的质因子通过上述方式压缩即可,$|stats|$为17496,复杂度可以通过

 1 #include<bits/stdc++.h>
2 using namespace std;
3 #define N 305
4 #define STA 17496
5 #define ll long long
6 struct ji{
7 int a[11];
8 }o;
9 int n,x,mod,a[N],vis[N],mi[300005],w[STA],p[7]={2,3,5,7,11,13,17};
10 ll ans,f[STA][2];
11 void add(ll &x,int y){
12 x=(x+y)%mod;
13 }
14 int hash(ji k){
15 return k.a[6]+3*k.a[5]+9*k.a[4]+27*k.a[3]+81*k.a[2]+324*k.a[1]+1944*k.a[0];
16 }
17 ji inv_hash(int k){
18 ji ans;
19 ans.a[0]=k/1944;
20 ans.a[1]=k%1944/324;
21 ans.a[2]=k%324/81;
22 ans.a[3]=k%81/27;
23 ans.a[4]=k%27/9;
24 ans.a[5]=k%9/3;
25 ans.a[6]=k%3;
26 return ans;
27 }
28 ji dec(ji x,ji y){
29 ji ans;
30 for(int i=0;i<7;i++)ans.a[i]=max(x.a[i]-y.a[i],0);
31 return ans;
32 }
33 ji mx(ji x,ji y){
34 ji ans;
35 for(int i=0;i<7;i++)ans.a[i]=max(x.a[i],y.a[i]);
36 return ans;
37 }
38 ji div(int k){
39 ji ans;
40 for(int i=0;i<7;i++){
41 ans.a[i]=0;
42 while (k%p[i]==0){
43 k/=p[i];
44 ans.a[i]++;
45 }
46 }
47 return ans;
48 }
49 int main(){
50 scanf("%d%d",&n,&mod);
51 mi[0]=w[0]=1;
52 for(int i=1;i<=n;i++)mi[i]=2LL*mi[i-1]%mod;
53 for(int i=1;i<STA;i++){
54 o=inv_hash(i);
55 for(int j=0;j<7;j++)
56 if (o.a[j]){
57 o.a[j]--;
58 w[i]=1LL*w[hash(o)]*p[j]%mod;
59 break;
60 }
61 }
62 for(int i=1;i<=n;i++){
63 scanf("%d",&x);
64 a[x]++;
65 }
66 f[0][0]=1;
67 for(int i=1;i<N-4;i++)
68 if (w[hash(div(i))]==i){
69 o=div(i);
70 for(int j=STA-1;j>=0;j--)add(f[hash(mx(o,inv_hash(j)))][0],f[j][0]*(mi[a[i]]-1)%mod);
71 }
72 for(int i=0;i<STA;i++)f[i][0]=f[i][0]*w[i]%mod;
73 for(int i=19;i<N-4;i++){
74 if (w[hash(div(i))]>1)continue;
75 for(int j=i;j<N-4;j+=i){
76 o=div(j);
77 for(int k=STA-1;k>=0;k--)
78 add(f[hash(mx(o,inv_hash(k)))][1],(i*f[k][0]+f[k][1])%mod*w[hash(dec(o,inv_hash(k)))]%mod*(mi[a[j]]-1)%mod);
79 }
80 for(int j=0;j<STA;j++){
81 add(f[j][0],f[j][1]);
82 f[j][1]=0;
83 }
84 }
85 for(int i=0;i<STA;i++)add(ans,f[i][0]);
86 printf("%d",ans);
87 }

[luogu5616]恶魔之树的更多相关文章

  1. 【LGR-063】洛谷11月月赛 I & MtOI2019 Ex Div.2

    [MtOI2019]黑蚊子多: 送分向水题,直接模拟即可. #include<iostream> #include<cstdio> #define N 1505 using n ...

  2. 树链剖分+线段树 HDOJ 4897 Little Devil I(小恶魔)

    题目链接 题意: 给定一棵树,每条边有黑白两种颜色,初始都是白色,现在有三种操作: 1 u v:u到v路径(最短)上的边都取成相反的颜色 2 u v:u到v路径上相邻的边都取成相反的颜色(相邻即仅有一 ...

  3. B树——算法导论(25)

    B树 1. 简介 在之前我们学习了红黑树,今天再学习一种树--B树.它与红黑树有许多类似的地方,比如都是平衡搜索树,但它们在功能和结构上却有较大的差别. 从功能上看,B树是为磁盘或其他存储设备设计的, ...

  4. ASP.NET Aries 入门开发教程8:树型列表及自定义右键菜单

    前言: 前面几篇重点都在讲普通列表的相关操作. 本篇主要讲树型列表的操作. 框架在设计时,已经把树型列表和普通列表全面统一了操作,用法几乎是一致的. 下面介绍一些差距化的内容: 1:树型列表绑定: v ...

  5. 再讲IQueryable<T>,揭开表达式树的神秘面纱

    接上篇<先说IEnumerable,我们每天用的foreach你真的懂它吗?> 最近园子里定制自己的orm那是一个风生水起,感觉不整个自己的orm都不好意思继续混博客园了(开个玩笑).那么 ...

  6. HDU1671——前缀树的一点感触

    题目http://acm.hdu.edu.cn/showproblem.php?pid=1671 题目本身不难,一棵前缀树OK,但是前两次提交都没有成功. 第一次Memory Limit Exceed ...

  7. 算法与数据结构(十一) 平衡二叉树(AVL树)

    今天的博客是在上一篇博客的基础上进行的延伸.上一篇博客我们主要聊了二叉排序树,详情请戳<二叉排序树的查找.插入与删除>.本篇博客我们就在二叉排序树的基础上来聊聊平衡二叉树,也叫AVL树,A ...

  8. [C#] C# 知识回顾 - 表达式树 Expression Trees

    C# 知识回顾 - 表达式树 Expression Trees 目录 简介 Lambda 表达式创建表达式树 API 创建表达式树 解析表达式树 表达式树的永久性 编译表达式树 执行表达式树 修改表达 ...

  9. bzoj3207--Hash+主席树

    题目大意: 给定一个n个数的序列和m个询问(n,m<=100000)和k,每个询问包含k+2个数字:l,r,b[1],b[2]...b[k],要求输出b[1]~b[k]在[l,r]中是否出现. ...

随机推荐

  1. The Data Way Vol.3|做到最后只能删库跑路?DBA 能做的还有很多

    关于「The Data Way」 「The Data Way」是由 SphereEx 公司出品的一档播客节目.这里有开源.数据.技术的故事,同时我们关注开发者的工作日常,也讨论开发者的生活日常:我们聚 ...

  2. Tomcat实现自定义类加载器

    什么是类加载器? 这是官方给的定义 在 Java 虚拟机的实现中,初始类可以作为命令行参数提供. 或者,该实现可以提供一个初始类,该类设置一个类加载器,该类加载器依次加载应用程序. 初始类的其他选择也 ...

  3. Google Style Guides

    Google Style Guides Google Style Guides Google 开源项目风格指南 (zh-google-styleguide.readthedocs.io)

  4. Redis分布式锁的正确实现方式[转载]

    前言 分布式锁一般有三种实现方式:1. 数据库乐观锁:2. 基于Redis的分布式锁:3. 基于ZooKeeper的分布式锁.本篇博客将介绍第二种方式,基于Redis实现分布式锁.虽然网上已经有各种介 ...

  5. 虚拟机研究系列-「GC本质底层机制」SafePoint的深入分析和底层原理探究指南

    SafePoint前提介绍 在高度优化的现代JVM里,Safepoint有几种不同的用法.GC safepoint是最常见.大家听说得最多的,但还有deoptimization safepoint也很 ...

  6. Framework - 性能统计

    摘要 近期对接客户时,客户方希望提供 SDK 的性能.内存.隐私支持等一些数据,所以就对 SDK 进行了一些性能测试. 在用表格统计整理这些数据时,突然发现,经常用统计的方式看 SDK 的相关数据,似 ...

  7. IDEA 激活码,最新激活码,亲测有效,持续更新(2021.10.26)

    这里整理了一份 IntelliJ IDEA的最新激活码,持续更新 获取链接:[腾讯文档]分享白嫖JB Account和激活码(并附带破解工具) https://docs.qq.com/doc/DVnB ...

  8. 手把手教你学Dapr - 2. 必须知道的概念

    Sidecar 边车 Dapr API提供Http和gRPC两种通讯方式. 运行方式则可以是容器也可以是进程(Windows开发推荐使用Self Hosted,后续会解释). 这样的好处是与运行环境无 ...

  9. 通过Envoy实现.NET架构的网关

    什么是Gateway 在微服务体系结构中,如果每个微服务通常都会公开一组精细终结点,这种情况可能会有以下问题 如果没有 API 网关模式,客户端应用将与内部微服务相耦合. 在客户端应用中,单个页面/屏 ...

  10. [LGP2758]编辑距离

    目录 题目 题目描述 输入格式 输出格式 输入输出样例 题目分析 状态转移方程 初始状态 结束状态 Code 题目 题目描述 设A和B是两个字符串.我们要用最少的字符操作次数,将字符串A转换为字符串B ...