luoguP6624 [省选联考 2020 A 卷] 作业题(莫比乌斯反演,矩阵树定理)
luoguP6624 [省选联考 2020 A 卷] 作业题(莫比乌斯反演,矩阵树定理)
题外话:
Day2一题没切。
我是傻逼。
题解时间
某种意义上说刻在DNA里的柿子,大概是很多人学莫反做的第一题的套路。
$ \phi \cdot 1 = id $ 。
然后直接转化:
& \sum_{T} ( ( \sum w_{e_i} ) * gcd( w_{e_i} ) ) \\
= & \sum_{T} ( ( \sum w_{e_i} ) * \sum_{d|gcd( w_{e_i} )} \phi(d) ) \\
= & \sum_{d} \phi(d) \sum_{T:d|gcd( w_{e_i} )} ( \sum w_{e_i} )
\end{aligned}
\]
然后对于求出边权和,简单的想法是对于每条边求有多少含这条边的树。
这时就可以想到矩阵树定理了。但怎么对于每个边求呢?
简单思考发现矩阵元素变成 $ (a+bx) $ 的形式就可以解决。
一条边加的元素是 $ (1+wx) $ ,答案就是求得结果的一次项系数。
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<iostream>
using namespace std;
typedef long long lint;
template<typename TP>inline void read(TP &tar)
{
TP ret=0,f=1;char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){ret=ret*10+(ch-'0');ch=getchar();}
tar=ret*f;
}
namespace RKK
{
const int N=40,M=500;
const int mo=998244353;
int add(const int &a,const int &b){return a+b>=mo?a+b-mo:a+b;}
void doadd(int &a,const int &b){if((a+=b)>=mo) a-=mo;}
int fpow(int a,int p){int ret=1;while(p){if(p&1)ret=1ll*ret*a%mo;a=1ll*a*a%mo,p>>=1;}return ret;}
int pr[160011],pc,phi[160011];bool npr[160011];
void sieve()
{
phi[1]=1;for(int i=2;i<=160000;i++)
{
if(!npr[i]) pr[++pc]=i,phi[i]=i-1;
for(int j=1;j<=pc&&i*pr[j]<=160000;j++)
{
npr[i*pr[j]]=1;
if(i%pr[j]==0){phi[i*pr[j]]=phi[i]*pr[j];break;}
else phi[i*pr[j]]=phi[i]*(pr[j]-1);
}
}
}
int n,m,ans,ex[M],ey[M],ew[M];
struct pat
{
int x,y;
pat(const int &x=0,const int &y=0):x(x),y(y){}
pat operator+(const pat &p)const{return pat(add(x,p.x),add(y,p.y));}
pat operator-(const pat &p)const{return pat(add(x,mo-p.x),add(y,mo-p.y));}
pat operator*(const pat &p)const{return pat(1ll*x*p.x%mo,(1ll*x*p.y+1ll*p.x*y)%mo);}
pat operator/(const pat &p)const
{
int iv=fpow(p.x,mo-2);
return pat(1ll*x*iv%mo,1ll*add(1ll*y*p.x%mo,mo-1ll*x*p.y%mo)*iv%mo*iv%mo);
}
};
pat a[N][N];
pat mtree()
{
pat ret=pat(1,0);bool rev=0;
for(int l=1,e;l<n;l++)
{
for(e=l;e<n;e++)if(a[e][l].x) break;if(e==n) return pat(0,0);
if(e!=l){rev^=1;for(int j=1;j<n;j++) swap(a[l][j],a[e][j]);}
pat k=pat(1,0)/a[l][l];
for(int i=l+1;i<n;i++)
{
pat g=k*a[i][l];
for(int j=l;j<n;j++) a[i][j]=a[i][j]-g*a[l][j];
}
ret=ret*a[l][l];
}
if(rev) ret=pat(0,0)-ret;return ret;
}
int getans(int p)
{
memset(a,0,sizeof(a));
for(int i=1;i<=m;i++)if(ew[i]%p==0)
{
a[ex[i]][ey[i]]=a[ex[i]][ey[i]]-pat(1,ew[i]);
a[ey[i]][ex[i]]=a[ey[i]][ex[i]]-pat(1,ew[i]);
a[ex[i]][ex[i]]=a[ex[i]][ex[i]]+pat(1,ew[i]);
a[ey[i]][ey[i]]=a[ey[i]][ey[i]]+pat(1,ew[i]);
}
return mtree().y;
}
int ct[160011];
int main()
{
sieve();read(n),read(m);
for(int i=1;i<=m;i++)
{
read(ex[i]),read(ey[i]),read(ew[i]);
for(int j=1;j*j<=ew[i];j++)if(ew[i]%j==0){ct[j]++;if(ew[i]/j!=j) ct[ew[i]/j]++;}
}
for(int i=1;i<=160000;i++)if(ct[i]>=n-1) ans=(ans+1ll*phi[i]*getans(i))%mo;
printf("%d\n",ans);
return 0;
}
}
int main(){return RKK::main();}
luoguP6624 [省选联考 2020 A 卷] 作业题(莫比乌斯反演,矩阵树定理)的更多相关文章
- 洛谷 P6624 - [省选联考 2020 A 卷] 作业题(矩阵树定理+简单数论)
题面传送门 u1s1 这种题目还是相当套路的罢 首先看到 \(\gcd\) 可以套路地往数论方向想,我们记 \(f_i\) 为满足边权的 \(\gcd\) 为 \(i\) 的倍数的所有生成树的权值之和 ...
- [省选联考 2020 A 卷] 组合数问题
题意 [省选联考 2020 A 卷] 组合数问题 想法 自己在多项式和数论方面还是太差了,最近写这些题都没多少思路,看完题解才会 首先有这两个柿子 \(k*\dbinom{n}{k} = n*\dbi ...
- luoguP6623 [省选联考 2020 A 卷] 树(trie树)
luoguP6623 [省选联考 2020 A 卷] 树(trie树) Luogu 题外话: ...想不出来啥好说的了. 我认识的人基本都切这道题了. 就我只会10分暴力. 我是傻逼. 题解时间 先不 ...
- luoguP6620 [省选联考 2020 A 卷] 组合数问题(斯特林数)
luoguP6620 [省选联考 2020 A 卷] 组合数问题(斯特林数) Luogu 题外话: LN切这题的人比切T1的多. 我都想到了组合意义乱搞也想到可能用斯特林数为啥还是没做出来... 我怕 ...
- 洛谷P6623——[省选联考 2020 A 卷] 树
传送门:QAQQAQ 题意:自己看 思路:正解应该是线段树/trie树合并? 但是本蒟蒻啥也不会,就用了树上二次差分 (思路来源于https://www.luogu.com.cn/blog/dengy ...
- P6628-[省选联考 2020 B 卷] 丁香之路【欧拉回路,最小生成树】
正题 题目链接:https://www.luogu.com.cn/problem/P6628 题目大意 给出\(n\)个点的一张完全无向图,\(i\sim j\)的边权是\(|i-j|\). 然后给出 ...
- [题解] LOJ 3300 洛谷 P6620 [省选联考 2020 A 卷] 组合数问题 数学,第二类斯特林数,下降幂
题目 题目里要求的是: \[\sum_{k=0}^n f(k) \times X^k \times \binom nk \] 这里面出现了给定的多项式,还有组合数,这种题目的套路就是先把给定的普通多项 ...
- 题解 P6622 [省选联考 2020 A/B 卷] 信号传递
洛谷 P6622 [省选联考 2020 A/B 卷] 信号传递 题解 某次模拟赛的T2,考场上懒得想正解 (其实是不会QAQ), 打了个暴力就骗了\(30pts\) 就火速溜了,参考了一下某位强者的题 ...
- luoguP6622 [省选联考 2020 A/B 卷] 信号传递(状压dp)
luoguP6622 [省选联考 2020 A/B 卷] 信号传递(状压dp) Luogu 题外话: 我可能是傻逼, 但不管我是不是傻逼, 我永远单挑出题人. 题解时间 看数据范围可以确定状压dp. ...
随机推荐
- Linux目录结构详细
今日内容 解析映射文件 在 window 和 Linux 系统中都有解析文件,一般名为 host,存放在配置目录 etc 中 在本地机访问网络输入域名时,首先会解析 host 文件,如果域名有对应的i ...
- set和setenv
今天用set设置PATH变量(加一个路径),发现虽然echo的时候显示修改成功了,实际执行命令的时候确没有去那个路径查找:当前shell是c shell(csh). 在网上找了一些材料,总结如下: ...
- 教你如何使用flask实现ajax数据入库
摘要:在正式编写前需要了解一下如何在 python 函数中去判断,一个请求是 get 还是 post. 本文分享自华为云社区<[首发]flask 实现ajax 数据入库,并掌握文件上传>, ...
- 攻防世界 MOBILE RemeberOther
解题思路: 下载后解压可以得到一个apk文件和word文件.查看word文件,里面写了比较简单的一句话,未获有有效信息.(后续会讲到这个word文档的使用) word内容 运行apk文件,如图: ap ...
- iOS自动化测试驱动工具探索
本文主要介绍了字节 iOS 自动化测试驱动工具的探索过程及实现原理 作者:字节跳动终端技术--陈友辉 一.背景 随着业务的扩张,单个 App 的功能越来越多,工程复杂度越来越高,每天MR可达上百次,代 ...
- 彻底关闭 win10家庭版 杀毒软件windows defender
下面开始今天的教程, 第一步,我们先在windows安全中心将相关的设置关闭一下,具体方法如下: 我们右键点击windows 10开始菜单,点击"设置", 点击"设置&q ...
- 【Oracle】PLSQL如何更新、提交数据库中数据
转至:https://blog.csdn.net/Bee_AI/article/details/89279612 Oracle更新单表数据时,一般使用SELECT--FOR UPDATE语句,这条语句 ...
- linux shell脚本批量修改密码,无需交互输入
转至:https://blog.csdn.net/weixin_34409357/article/details/89833777?utm_medium=distribute.pc_relevant. ...
- Python:matplotlib.cm 色表
官网:Choosing Colormaps in Matplotlib - Matplotlib 3.5.0 documentation Colormap与matplotlib.cm 我们以等高区域函 ...
- Tableau学习Step2一数据文件的读取与统计图、表的概述
Tableau学习Step2一数据文件的读取与统计图.表的概述 本文首发于博客冰山一树Sankey,去博客浏览效果更好. 一. 前言 本教程通过一个案例从浅到深来学习Tableau知识 案例概述: 二 ...