题面传送门

u1s1 这种题目还是相当套路的罢

首先看到 \(\gcd\) 可以套路地往数论方向想,我们记 \(f_i\) 为满足边权的 \(\gcd\) 为 \(i\) 的倍数的所有生成树的权值之和,\(g_i\) 为边权的 \(\gcd\) 恰好为 \(i\) 的所有生成树的权值之和,那么显然 \(f_i=\sum\limits_{i\mid j}g_j\),莫反一下可得 \(g_i=\sum\limits_{i\mid j}f_i\mu(\dfrac{j}{i})\),因此我们只需求出 \(f_i\) 即可求出 \(g_i\) 及最终的答案。

接下来考虑怎样求 \(f_i\),我们考虑原图 \(G\) 中边权为 \(i\) 的倍数的边组成的子图 \(G'\),那么 \(f_i\) 等价于 \(G'\) 所有生成树的边权之和,看到生成树计数这类题目我们很自然地可以想到 Matrix-Tree 定理。不过一般来说 Matrix-Tree 定理解决的是求所有生成树边权乘积之和,而此题要求的是所有生成树边权之和,这里有一个烂大街但我觉得挺妙的套路,我们将所有边的边权看作一个一次函数 \(y=1+wx\),那么显然这个边权和就是生成树上所有一次函数乘积的一次项,这显然是可以 Matrix-Tree 的。不过问题又来了,再求矩阵行列式的过程中涉及加减乘除运算,怎样定义这些运算呢?首先由于我们只关心最终函数的一次项,因此我们可以将所有运算放在 \(\bmod x^2\) 意义下进行,加减法就直接加就行了,乘法就稍微用下分配律,\((a+bx)(c+dx)=ac+(ad+bc)x\),除法稍微有点麻烦,不过学过多项式的比较好理解,首先 \(\dfrac{a+bx}{c+dx}\) 的常数项必须是 \(\dfrac{a}{c}\),因为只有 \(\dfrac{a}{c}\) 乘上 \(c+dx\) 后常数项才能得到 \(a\),代入待定系数法算一下也可得到一次项是 \(\dfrac{bc-ad}{c^2}\),即 \(\dfrac{a+bx}{c+dx}=\dfrac{a}{c}+\dfrac{bc-ad}{c^2}x\),写个结构体维护一下即可。

这样暴力复杂度是 \(wn^3\) 的,可能有卡常的风险,保险起见我们加上一个小小的优化,就是如果边权为 \(i\) 的倍数的边数 \(<n-1\) 那么直接令 \(f_i=0\),因为不可能存在生成树,加了这个优化以后复杂度显然变成了 \(\dfrac{md(w_i)}{n-1}n^3\),即可通过此题。

然鹅我又搞错模数了所以 WA 了一次

  1. const int MAXM=435;
  2. const int MAXN=30;
  3. const int MAXV=152505;
  4. const int MOD=998244353;
  5. int qpow(int x,int e){
  6. int ret=1;
  7. for(;e;e>>=1,x=1ll*x*x%MOD) if(e&1) ret=1ll*ret*x%MOD;
  8. return ret;
  9. }
  10. int n,m,u[MAXM+5],v[MAXM+5],w[MAXM+5];
  11. vector<int> eds[MAXV+5];
  12. int mu[MAXV+5],pr[MAXV/6+5],prcnt=0;
  13. bitset<MAXV+5> vis;
  14. void sieve(int mx){
  15. mu[1]=1;
  16. for(int i=2;i<=mx;i++){
  17. if(!vis[i]){pr[++prcnt]=i;mu[i]=-1;}
  18. for(int j=1;j<=prcnt&&pr[j]*i<=mx;j++){
  19. vis[pr[j]*i]=1;
  20. if(i%pr[j]==0) break;
  21. else mu[pr[j]*i]=-mu[i];
  22. }
  23. }
  24. }
  25. struct line{
  26. int x,y;
  27. line(int _x=0,int _y=0):x(_x),y(_y){}
  28. line operator +(const line &rhs){return line((x+rhs.x)%MOD,(y+rhs.y)%MOD);}
  29. line operator -(const line &rhs){return line((x-rhs.x+MOD)%MOD,(y-rhs.y+MOD)%MOD);}
  30. line operator *(const line &rhs){return line(1ll*x*rhs.x%MOD,(1ll*x*rhs.y+1ll*y*rhs.x)%MOD);}
  31. line operator /(const line &rhs){int iv=qpow(rhs.x,MOD-2);return line(1ll*x*iv%MOD,1ll*iv*iv%MOD*
  32. ((1ll*y*rhs.x%MOD-1ll*x*rhs.y%MOD+MOD)%MOD)%MOD);}
  33. };
  34. line a[MAXN+5][MAXN+5];
  35. int f[MAXV+5],g[MAXV+5];
  36. int main(){
  37. scanf("%d%d",&n,&m);sieve(MAXV);
  38. for(int i=1;i<=m;i++){
  39. scanf("%d%d%d",&u[i],&v[i],&w[i]);
  40. for(int j=1;j*j<=w[i];j++) if(w[i]%j==0){
  41. eds[j].pb(i);if(w[i]/j!=j) eds[w[i]/j].pb(i);
  42. }
  43. }
  44. for(int i=1;i<=MAXV;i++){
  45. if(eds[i].size()<n-1) continue;
  46. for(int j=1;j<n;j++) for(int k=1;k<n;k++)
  47. a[j][k]=line(0,0);
  48. for(int j=0;j<eds[i].size();j++){
  49. int eid=eds[i][j];//printf("%d\n",eid);
  50. int U=u[eid]-1,V=v[eid]-1;
  51. a[U][V]=a[U][V]-line(1,w[eid]);
  52. a[V][U]=a[V][U]-line(1,w[eid]);
  53. a[U][U]=a[U][U]+line(1,w[eid]);
  54. a[V][V]=a[V][V]+line(1,w[eid]);
  55. } int sgn=1;
  56. for(int j=1;j<n;j++){
  57. int t=j;
  58. for(int k=j+1;k<n;k++) if(a[k][j].x) t=k;
  59. if(t!=j) sgn=-sgn;
  60. for(int k=j;k<n;k++) swap(a[t][k],a[j][k]);
  61. line iv=line(1,0)/a[j][j];
  62. for(int k=j+1;k<n;k++){
  63. line mul=line(0,0)-a[k][j]*iv;
  64. for(int l=j;l<n;l++) a[k][l]=a[k][l]+mul*a[j][l];
  65. }
  66. } line ret=line((sgn+MOD)%MOD,0);
  67. for(int j=1;j<n;j++) ret=ret*a[j][j];
  68. f[i]=ret.y;
  69. // printf("%d %d\n",i,f[i]);
  70. } int ans=0;
  71. for(int i=1;i<=MAXV;i++){
  72. for(int j=i;j<=MAXV;j+=i) g[i]=(0ll+g[i]+1ll*f[j]*mu[j/i]+MOD)%MOD;
  73. ans=(ans+1ll*g[i]*i)%MOD;
  74. } printf("%d\n",ans);
  75. return 0;
  76. }
  77. /*
  78. 4 5
  79. 1 2 6
  80. 1 3 8
  81. 1 4 9
  82. 2 3 12
  83. 3 4 18
  84. */

洛谷 P6624 - [省选联考 2020 A 卷] 作业题(矩阵树定理+简单数论)的更多相关文章

  1. 洛谷P6623——[省选联考 2020 A 卷] 树

    传送门:QAQQAQ 题意:自己看 思路:正解应该是线段树/trie树合并? 但是本蒟蒻啥也不会,就用了树上二次差分 (思路来源于https://www.luogu.com.cn/blog/dengy ...

  2. [题解] LOJ 3300 洛谷 P6620 [省选联考 2020 A 卷] 组合数问题 数学,第二类斯特林数,下降幂

    题目 题目里要求的是: \[\sum_{k=0}^n f(k) \times X^k \times \binom nk \] 这里面出现了给定的多项式,还有组合数,这种题目的套路就是先把给定的普通多项 ...

  3. luoguP6624 [省选联考 2020 A 卷] 作业题(莫比乌斯反演,矩阵树定理)

    luoguP6624 [省选联考 2020 A 卷] 作业题(莫比乌斯反演,矩阵树定理) Luogu 题外话: Day2一题没切. 我是傻逼. 题解时间 某种意义上说刻在DNA里的柿子,大概是很多人学 ...

  4. 洛谷 P7520 - [省选联考 2021 A 卷] 支配(支配树)

    洛谷题面传送门 真·支配树不 sb 的题. 首先题面已经疯狂暗示咱们建出支配树对吧,那咱就老老实实建呗.由于这题数据范围允许 \(n^2\)​ 算法通过,因此可以考虑 \(\mathcal O(n^2 ...

  5. 洛谷 P7515 - [省选联考 2021 A 卷] 矩阵游戏(差分约束)

    题面传送门 emmm--怎么评价这个题呢,赛后学完差分约束之后看题解感觉没那么 dl,可是现场为啥就因为种种原因想不到呢?显然是 wtcl( 先不考虑"非负"及" \(\ ...

  6. [省选联考 2020 A 卷] 组合数问题

    题意 [省选联考 2020 A 卷] 组合数问题 想法 自己在多项式和数论方面还是太差了,最近写这些题都没多少思路,看完题解才会 首先有这两个柿子 \(k*\dbinom{n}{k} = n*\dbi ...

  7. luoguP6623 [省选联考 2020 A 卷] 树(trie树)

    luoguP6623 [省选联考 2020 A 卷] 树(trie树) Luogu 题外话: ...想不出来啥好说的了. 我认识的人基本都切这道题了. 就我只会10分暴力. 我是傻逼. 题解时间 先不 ...

  8. luoguP6620 [省选联考 2020 A 卷] 组合数问题(斯特林数)

    luoguP6620 [省选联考 2020 A 卷] 组合数问题(斯特林数) Luogu 题外话: LN切这题的人比切T1的多. 我都想到了组合意义乱搞也想到可能用斯特林数为啥还是没做出来... 我怕 ...

  9. 洛谷 P7516 - [省选联考 2021 A/B 卷] 图函数(Floyd)

    洛谷题面传送门 一道需要发现一些简单的性质的中档题(不过可能这道题放在省选 D1T3 中偏简单了?) u1s1 现在已经是 \(1\text{s}\)​ \(10^9\)​ 的时代了吗?落伍了落伍了/ ...

随机推荐

  1. Python读取Excel表格

    前言:需要进行自动化办公或者自动化测试的朋友,可以了解下此文,掌握Python读取Excel表格的方法. 一.准备工作: 1.安装Python3.7.0(官网下载安装包) 2.安装Pycharm(官网 ...

  2. kivy Label标记文本

    from kivy.app import App from kivy.uix.boxlayout import BoxLayout from kivy.lang import Builder # 注意 ...

  3. [no_code][Alpha]发布声明报告

    项目 内容 2020春季计算机学院软件工程(罗杰 任健) 2020春季计算机学院软件工程(罗杰 任健) 作业要求 发布声明 我们在这个课程的目标是 设计出一个OCR表单处理软件 这个作业在哪个具体方面 ...

  4. Spring Security 多过滤链的使用

    Spring Security 多过滤链的使用 一.背景 二.需求 1.给客户端使用的api 2.给网站使用的api 三.实现方案 方案一: 方案二 四.实现 1.app 端 Spring Secur ...

  5. 21.7.24 test

    \(NOIP\) 模拟赛 考差了. T1签到题.注意存在字符串长度为0,不能直接模.\(100\rightarrow0\) 代码: #include<bits/stdc++.h> usin ...

  6. 第01课 OpenGL窗口(4)

    下面的代码处理所有的窗口消息.当我们注册好窗口类之后,程序跳转到这部分代码处理窗口消息. LRESULT CALLBACK WndProc( HWND hWnd, // 窗口的句柄 UINT uMsg ...

  7. 【java设计模式】(10)---模版方法模式(案例解析)

    一.概念 1.概念 模板方法模式是一种基于继承的代码复用技术,它是一种类行为型模式. 它定义一个操作中的算法的骨架,而将一些步骤延迟到子类中.模板方法使得子类可以不改变一个算法的结构即可重定义该算法的 ...

  8. Flink入门-第一篇:Flink基础概念以及竞品对比

    Flink入门-第一篇:Flink基础概念以及竞品对比 Flink介绍 截止2021年10月Flink最新的稳定版本已经发展到1.14.0 Flink起源于一个名为Stratosphere的研究项目主 ...

  9. sudo user1账号获得管理员root的权限

    user1虽然有sudo权限,但不是真正的root权限,修改内核参数之类的就做不了 但是有sudo权限就可以添加账号,以下添加了admin账号与root账号一样的权限 useradd -u 0   - ...

  10. Java不同时区(timezone)之间时间转换

    最近出现一个问题是这样的:我们的系统在国外打印的日志时间由于时差关系和国内不一致,看起来不方便,希望国外的日志和国内保持一致,即:需要对不同时区的时间做转换调整,统一为国内时间. 一.关于时区的一些概 ...