loj6271 「长乐集训 2017 Day10」生成树求和 加强版(矩阵树定理,循环卷积)

loj

题解时间

首先想到先分开三进制下每一位,然后每一位分别求结果为0,1,2的树的个数。

然后考虑矩阵树求出来的是树的边权之积的和,而我们要求树的边权的不进位三进制和的和。

由于矩阵树求出来的是树的边权之积的和,考虑暴力上生成函数求解循环卷积,结果就是 $ c $ 的项的系数和。

但很明显生成函数暴力算是没得整的。

所以我们想到了利用单位根实现的k进制FWT。

很幸运的 $ \omega_{ 3 }^{ 2 } = - \omega_{ 3 } -1 $ 。

这样一来数值可以直接用一个 $x + y \omega_{ 3 } $ 来表示。

求出每一位的点值之后直接IFWT回去。

但是我不会(悲)

代码

为什么会有文件读写啊,正巧在loj刚咕完恢复过来的时候交,T了好多次以为loj评测姬也咕了呢。。。

不就是你自己不好好读题。

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. typedef long long lint;
  4. struct pat{int x,y;pat(int x=0,int y=0):x(x),y(y){}bool operator<(const pat &p)const{return x==p.x?y<p.y:x<p.x;}};
  5. template<typename TP>inline void read(TP &tar)
  6. {
  7. TP ret=0,f=1;char ch=getchar();
  8. while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
  9. while(ch>='0'&&ch<='9'){ret=ret*10+(ch-'0');ch=getchar();}
  10. tar=ret*f;
  11. }
  12. template<typename TP,typename... Args>inline void read(TP& t,Args&... args){read(t),read(args...);}
  13. namespace RKK
  14. {
  15. const int N=110,M=5011,C=19683;
  16. const int mo=1000000007,inv3=333333336;
  17. void doadd(int &a,int b){if((a+=b)>=mo) a-=mo;}int add(int a,int b){return (a+=b)>=mo?a-mo:a;}
  18. void dodec(int &a,int b){doadd(a,mo-b);}int dec(int a,int b){return add(a,mo-b);}
  19. void domul(int &a,int b){a=1ll*a*b%mo;}int mul(int a,int b){return 1ll*a*b%mo;}
  20. int fpow(int a,int p){int ret=1;while(p){if(p&1) domul(ret,a);domul(a,a),p>>=1;}return ret;}
  21. struct cp
  22. {
  23. int x,y;//x+yw
  24. cp(const int &x=0,const int &y=0):x(x),y(y){}
  25. operator bool(){return x||y;}
  26. cp inv()const{int i=fpow(dec(add(mul(x,x),mul(y,y)),mul(x,y)),mo-2);return cp(mul(dec(x,y),i),mul(dec(0,y),i));}
  27. cp operator+(const cp &p)const{return cp(add(x,p.x),add(y,p.y));}
  28. cp operator-(const cp &p)const{return cp(dec(x,p.x),dec(y,p.y));}
  29. cp operator*(const cp &p)const{return cp(dec(mul(x,p.x),mul(y,p.y)),dec(add(mul(x,p.y),mul(p.x,y)),mul(y,p.y)));}
  30. void operator+=(const cp &p){*this=*this+p;}
  31. void operator-=(const cp &p){*this=*this-p;}
  32. void operator*=(const cp &p){*this=*this*p;}
  33. };
  34. const cp om[]={cp(1,0),cp(0,1),cp(mo-1,mo-1)};
  35. int n,m,ans,ex[M],ey[M],ew[M];
  36. cp a[N][N];
  37. cp calc()
  38. {
  39. cp ret=cp(1,0);
  40. for(int l=1;l<n;l++)
  41. {
  42. int e=0;for(int i=l;i<n;i++)if(a[i][l]){e=i;break;}
  43. if(!e) return cp(0,0);
  44. if(e!=l){ret=cp(0,0)-ret;for(int j=1;j<n;j++) swap(a[l][j],a[e][j]);}
  45. cp inv=a[l][l].inv();
  46. for(int i=l+1;i<n;i++)
  47. {
  48. cp k=a[i][l]*inv;
  49. for(int j=l;j<n;j++) a[i][j]-=k*a[l][j];
  50. }
  51. ret*=a[l][l];
  52. }return ret;
  53. }
  54. int main()
  55. {
  56. freopen("sum.in","r",stdin),freopen("sum.out","w",stdout);
  57. read(n,m);for(int i=1;i<=m;i++) read(ex[i],ey[i],ew[i]);
  58. for(int p=1;p<C;p*=3)
  59. {
  60. static cp at[3];
  61. static cp w,x,y;
  62. for(int i=0;i<3;i++)
  63. {
  64. memset(a,0,sizeof(a));
  65. for(int j=1;j<=m;j++)
  66. {
  67. w=om[(i*((ew[j]/p)%3))%3];
  68. a[ex[j]][ex[j]]+=w,a[ey[j]][ey[j]]+=w;
  69. a[ex[j]][ey[j]]-=w,a[ey[j]][ex[j]]-=w;
  70. }at[i]=calc();
  71. }
  72. x=at[0]+at[1]*om[2]+at[2]*om[1],y=at[0]+at[1]*om[1]+at[2]*om[2];
  73. doadd(ans,mul(p,add(x.x,add(y.x,y.x))));
  74. }
  75. domul(ans,inv3);
  76. printf("%d\n",ans);
  77. return 0;
  78. }
  79. }
  80. int main(){return RKK::main();}

loj6271 「长乐集训 2017 Day10」生成树求和 加强版(矩阵树定理,循环卷积)的更多相关文章

  1. loj6271「长乐集训 2017 Day10」生成树求和 加强版

    又是一个矩阵树套多项式的好题. 这里我们可以对每一位单独做矩阵树,但是矩阵树求的是边权积的和,而这里我们是要求加法,于是我们i将加法转化为多项式的乘法,其实这里相当于一个生成函数?之后如果我们暴力做的 ...

  2. LOJ#6271. 「长乐集训 2017 Day10」生成树求和 加强版

    传送门 由于是边权三进制不进位的相加,那么可以考虑每一位的贡献 对于每一位,生成树的边权相当于是做模 \(3\) 意义下的加法 考虑最后每一种边权的生成树个数,这个可以直接用生成函数,在矩阵树求解的时 ...

  3. 「长乐集训 2017 Day10」划分序列 (二分 dp)

    「长乐集训 2017 Day10」划分序列 题目描述 给定一个长度为 n nn 的序列 Ai A_iA​i​​,现在要求把这个序列分成恰好 K KK 段,(每一段是一个连续子序列,且每个元素恰好属于一 ...

  4. 「长乐集训 2017 Day8」修路 (斯坦纳树)

    题目描述 村子间的小路年久失修,为了保障村子之间的往来,AAA君决定带领大家修路. 村子可以看做是一个边带权的无向图GGG, GGG 由 nnn 个点与 mmm 条边组成,图中的点从 1∼n1 \si ...

  5. 「长乐集训 2017 Day1」区间 线段树

    题目 对于两个区间\((a,b),(c,d)\),若\(c < a < d\)或\(c < b < d\)则可以从\((a,b)\)走到\((c,d)\)去,现在有以下两种操作 ...

  6. 「6月雅礼集训 2017 Day10」quote

    [题目大意] 一个合法的引号序列是空串:如果引号序列合法,那么在两边加上同一个引号也合法:或是把两个合法的引号序列拼起来也是合法的. 求长度为$n$,字符集大小为$k$的合法引号序列的个数.多组数据. ...

  7. LOJ#6049. 「雅礼集训 2017 Day10」拍苍蝇(计算几何+bitset)

    题面 传送门 题解 首先可以用一个矩形去套这个多边形,那么我们只要枚举这个矩形的左下角就可以枚举完所有多边形的位置了 我们先对每一个\(x\)坐标开一个\(bitset\),表示这个\(x\)坐标里哪 ...

  8. LOJ#6047. 「雅礼集训 2017 Day10」决斗(set)

    题面 传送门 题解 这么简单一道题我考试的时候居然只打了\(40\)分暴力? 如果我们把每个点的\(a_i\)记为\(deg_i-1\),其中\(deg_i\)表示有\(deg_i\)个数的\(A_i ...

  9. LOJ#6048. 「雅礼集训 2017 Day10」数列(线段树)

    题面 传送门 题解 我的做法似乎非常复杂啊-- 首先最长上升子序列长度就等于把它反过来再接到前面求一遍,比方说把\(2134\)变成\(43122134\),实际上变化之后的求一个最长上升子序列和方案 ...

随机推荐

  1. MySQL 5.7 基于GTID主从复制+并行复制+半同步复制

    环境准备 IP HOSTNAME SERVICE SYSTEM 192.168.131.129 mysql-master1 mysql CentOS7.6 192.168.131.130 mysql- ...

  2. Python基础—编码(Day2)

    一.字符编码 1.ASCII码:包含英文.数字.特殊字符,8位=1字节byte =1个字符,如: 0010 1010 ASCII码表里的字符总共有256个,前128个为常用的字符如运算符,后128个称 ...

  3. 定制Centos7.9镜像

    Ps:因为工作内容:有一部份是需要重装系统:系统版本镜像为centos7.9.可每次装完都需要下载一些基础包:最近因为设备过多:网卡名称太乱:导致做后续配置太繁琐:不规整:索性自己定制个系统: 搭建基 ...

  4. Nginx-反向代理服务器

    概述 Nginx是一款轻量级的Web服务器.反向代理服务器,由于它的内存占用少,启动极快,高并发能力强,在互联网项目中广泛应用. 优点 nginx是多进程的,不会出现并发问题,不用加锁.一个进程出问题 ...

  5. 使用传统的三层架构出现的问题.引入Spring底层实现原理来解决(工厂模式+反射+XML配置文件/注解)

    以前写的代码 mapper层 public interface PersonMapper { void selectPersonList(); } public class PersonMapperI ...

  6. Anchor-free目标检测综述 -- Dense Prediction篇

      早期目标检测研究以anchor-based为主,设定初始anchor,预测anchor的修正值,分为two-stage目标检测与one-stage目标检测,分别以Faster R-CNN和SSD作 ...

  7. k8s之pod讲解

    什么是Pod?    Pod 是一组紧密关联的容器集合,它由一组.一个或多个容器组成,每个Pod还包含了一个Pause容器,Pause容器是Pod的父容器,主要负责僵尸进程的回收管理,通过Pause容 ...

  8. RFC2899广播帧转发测试——网络测试仪实操

    一.简介 RFC 2889为LAN交换设备的基准测试提供了方法学,它将RFC 2544中为网络互联设备基准测试所定义的方法学扩展到了交换设备,提供了交换机转发性能(Forwarding Perform ...

  9. PPT绝对不能没有它!精美酷炫的可视化图表来啦!

    从我们上学到工作,PPT我们见得多了,也做得多了.上学的时候最怕老师布置的作业是以PPT形式上交,工作中项目汇报.工作总结.年终汇报等,哪哪都需要用到PPT.PPT中文字太多,被批判不够简炼:图片太多 ...

  10. 【C# 线程】开篇 线程

    概述 线程主要学习什么,通过一个月的摸索.终于总结出来了:学习Thread类涉及到学习Thread类涉及到线程单元状态: ApartmentState.GetApartmentState\SetApa ...