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

Luogu

题外话:

Day2一题没切。

我是傻逼。

题解时间

某种意义上说刻在DNA里的柿子,大概是很多人学莫反做的第一题的套路。

$ \phi \cdot 1 = id $ 。

然后直接转化:

\[\begin{aligned}
& \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 卷] 作业题(莫比乌斯反演,矩阵树定理)的更多相关文章

  1. 洛谷 P6624 - [省选联考 2020 A 卷] 作业题(矩阵树定理+简单数论)

    题面传送门 u1s1 这种题目还是相当套路的罢 首先看到 \(\gcd\) 可以套路地往数论方向想,我们记 \(f_i\) 为满足边权的 \(\gcd\) 为 \(i\) 的倍数的所有生成树的权值之和 ...

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

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

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

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

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

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

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

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

  6. P6628-[省选联考 2020 B 卷] 丁香之路【欧拉回路,最小生成树】

    正题 题目链接:https://www.luogu.com.cn/problem/P6628 题目大意 给出\(n\)个点的一张完全无向图,\(i\sim j\)的边权是\(|i-j|\). 然后给出 ...

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

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

  8. 题解 P6622 [省选联考 2020 A/B 卷] 信号传递

    洛谷 P6622 [省选联考 2020 A/B 卷] 信号传递 题解 某次模拟赛的T2,考场上懒得想正解 (其实是不会QAQ), 打了个暴力就骗了\(30pts\) 就火速溜了,参考了一下某位强者的题 ...

  9. luoguP6622 [省选联考 2020 A/B 卷] 信号传递(状压dp)

    luoguP6622 [省选联考 2020 A/B 卷] 信号传递(状压dp) Luogu 题外话: 我可能是傻逼, 但不管我是不是傻逼, 我永远单挑出题人. 题解时间 看数据范围可以确定状压dp. ...

随机推荐

  1. 故障分析:网络闪断引发的ServiceStack.Redis死锁问题

    背景说明 某天生产环境发生进程的活跃线程数过高的预警问题,且一天两个节点分别出现相同预警.此程序近一年没出现过此类预警,事出必有因,本文就记录下此次根因分析的过程. 监控看到的线程数变化情况: 初步的 ...

  2. GitLab API使用小结

    GitLab API使用小结 背景描述 需求描述: 最近因为工作上的需求,需要对GitLab进行大批量的操作,又因为服务器不在境内,所以所有的操作都需要连接VPN来进行FQ访问.目前大概有6000多个 ...

  3. 创建sqlsession工具类

    //1.sqlsession的获取: //类:GetSqlSession, 返回sqlsession对象,无参 public class GetSqlSession { public static S ...

  4. jmeter参数化文件路径问题

    问题 win下做好的带参数化文件的脚本,放到linux下运行,由于参数化文件路径不正确,导致脚本运行失败,如果解决这个问题呢? 方案一:参数化路径 比如,参数化文件我放到jmeter的bin目录下,参 ...

  5. 渗透测试工程师认证 | CISP-PTE证书含金量

    注册渗透测试工程师(CISP-PTE)认证是由中国信息安全测评中心针对攻防专业领域实施的资质培训, 是国内唯一针对网络安全渗透测试专业人才的资格认证,是目前国内最为主流及被业界认可的专业攻防领域的资质 ...

  6. 别再用 Redis List 实现消息队列了,Stream 专为队列而生

    上回说到使用 Redis 的 List 实现消息队列有很多局限性,比如: 没有良好的 ACK 机制: 没有 ConsumerGroup 消费组概念: 消息堆积. List 是线性结构,想要查询指定数据 ...

  7. Symfony Bundle开发视频教程分享

    之前分享了自己录制的<Symfony 5全面开发>视频教程,收到的反馈不错,说学到了东西,讲的很深入等等. 上一次分享的链接:自己录制的Symfony5视频教程,免费分享给大家学习. 小晒 ...

  8. 操作系统以及python的简介

    今日笔记 操作系统 文件的概念 编程语言的发展史 编程语言的分类 python简介 python解释器的版本说明 内容详细 操作系统 ​ 操作系统(Operating System,简称OS),是管理 ...

  9. VirtualBox 桥接模式

    网桥网络配置 以下内容来自:http://www.jianshu.com/p/a4dbdb40b72b 特点 1.如果主机可以上网,虚拟机可以上网 2.虚拟机之间可以ping通 3.虚拟机可以ping ...

  10. ASP.NET Core 6框架揭秘实例演示[18]:HttpClient处理管道

    我们知道ASP.NET的核心就是由中间件组成的请求处理管道,HttpClient也采用了类似的设计.HttpClient管道由一组HttpMessageHandler对象构成,这些HttpMessag ...