记录$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. HC(Histogram-based Contrast) 基于直方图对比度的显著性

    HC(Histogram-based Contrast) 基于直方图对比度的显著性 来源于: 2011, Global contrast based salient region detection, ...

  2. Spatial Analyst 工具-数学分析

    数学分析 # Process: Abs arcpy.gp.Abs_sa("", 输出栅格) # Process: Exp arcpy.gp.Exp_sa("", ...

  3. 题解 CF241E Flights

    题目传送门 题目大意 给出一个 \(n\) 个点 \(m\) 条边的 \(\texttt{DAG}\) ,给每条边设定边权为 \(1\) 或者 \(2\) ,使得 \(1\to n\) 的每条路径长度 ...

  4. uoj21 缩进优化(整除分块,乱搞)

    题目大意: 给定一个长度为\(n\)的序列 让你找一个\(x\),使得\(ans\)尽可能小 其中$$ans=\sum_{i=1}^{n}\lfloor\frac{a_i}{x}\rfloor + \ ...

  5. Vuls 漏洞扫描工具部署及效果展示

    Vuls 漏洞扫描工具部署及效果展示 介绍 Vuls根据NVD,OVAL等数据对主流Linux系统进行扫描,并具有完善的报告. 支持系统 Distribution Release Alpine 3.3 ...

  6. print spooler LPF 打印机漏洞

    打印机漏洞 该漏洞可以通过创建打印机驱动和端口,实现任意文件写入,用于提权或者写入后门. 打印机调用流程:client通过RPC调用server的spoolsv.exe,spoolsv.exe是sys ...

  7. 4.14——208. 实现 Trie (前缀树)

    前缀树(字典树)是经典的数据结构,以下图所示: 本来处理每个节点的子节点集合需要用到set,但是因为输入规定了只有26个小写字母,可以直接用一个[26]的数组来存储. 关于ASCII代码: Java ...

  8. Java 是编译型语言还是解释型语言?

    Java首先由编译器编译成.class类型的文件,这个是java自己类型的文件.然后在通过虚拟机(JVM)从.class文件中读一行解释执行一行.因此Java是一种半编译半解释的语言,理解这种意思即可 ...

  9. FastAPI 学习之路(五十六)将token存放在redis

    在之前的文章中,FastAPI 学习之路(二十九)使用(哈希)密码和 JWT Bearer 令牌的 OAuth2,FastAPI 学习之路(二十八)使用密码和 Bearer 的简单 OAuth2,Fa ...

  10. FastAPI 学习之路(二十九)使用(哈希)密码和 JWT Bearer 令牌的 OAuth2

    既然我们已经有了所有的安全流程,就让我们来使用 JWT 令牌和安全哈希密码让应用程序真正地安全. 关于 JWT 它是一个将 JSON 对象编码为密集且没有空格的长字符串的标准.字符串看起来像这样: e ...