\(\mathcal{Description}\)

  Link.

  给定一棵含有 \(n\) 个结点的树,设 \(S\) 为其中的非空联通子集,求

\[\sum_{S}(\gcd_{u\in S}u)^{|S|}.
\]

  \(n\le2\times10^5\)。

\(\mathcal{Solution}\)

  直接莫反(为什么当时我迟疑那么久 qwq):

\[\sum_{S}(\gcd_{u\in S}u)^{|S|}=\sum_{d=1}^n\sum_{dt|s_j,j=1,2,\cdots,|S|}\mu(t)\sum_{S}d^{|S|}.
\]

前两层直接枚举,最后一个简单树上 DP,复杂度是

\[\sum_{i=1}^n\sum_{j=1}^{\frac{n}i}\mathcal O(\frac{n}{ij})=\mathcal O(n\ln^2 n)?
\]

  记得提醒我看见 \(\gcd\) 不要忘了莫反这家伙。(

\(\mathcal{Code}\)

/* Clearink */

#include <cstdio>

#define rep( i, l, r ) for ( int i = l, rep##i = r; i <= rep##i; ++i )
#define per( i, r, l ) for ( int i = r, per##i = l; i >= per##i; --i ) inline int rint() {
int x = 0, f = 1, s = getchar();
for ( ; s < '0' || '9' < s; s = getchar() ) f = s == '-' ? -f : f;
for ( ; '0' <= s && s <= '9'; s = getchar() ) x = x * 10 + ( s ^ '0' );
return x * f;
} template<typename Tp>
inline void wint( Tp x ) {
if ( x < 0 ) putchar( '-' ), x = -x;
if ( 9 < x ) wint( x / 10 );
putchar( x % 10 ^ '0' );
} const int MAXN = 2e5, MOD = 1e9 + 7;
int n, ecnt, head[MAXN + 5];
struct Edge { int to, nxt; } graph[MAXN * 2 + 5]; inline int mul( const long long a, const int b ) { return a * b % MOD; }
inline int sub( int a, const int b ) { return ( a -= b ) < 0 ? a + MOD : a; }
inline void subeq( int& a, const int b ) { ( a -= b ) < 0 && ( a += MOD ); }
inline int add( int a, const int b ) { return ( a += b ) < MOD ? a : a - MOD; }
inline void addeq( int& a, const int b ) { ( a += b ) >= MOD && ( a -= MOD ); } inline void link( const int u, const int v ) {
graph[++ecnt] = { v, head[u] }, head[u] = ecnt;
graph[++ecnt] = { u, head[v] }, head[v] = ecnt;
} int pn, mu[MAXN + 5], pr[MAXN + 5];
bool npr[MAXN + 5]; inline void sieve( const int n ) {
mu[1] = 1;
rep ( i, 2, n ) {
if ( !npr[i] ) mu[pr[++pn] = i] = -1;
for ( int j = 1, t; j <= pn && ( t = i * pr[j] ) <= n; ++j ) {
npr[t] = true;
if ( !( i % pr[j] ) ) break;
mu[t] = -mu[i];
}
}
} bool vis[MAXN + 5];
int f[MAXN + 5]; inline void dfs( const int u, const int bas, const int fac ) {
vis[u] = true, f[u] = bas;
for ( int i = head[u], v; i; i = graph[i].nxt ) {
if ( !vis[v = graph[i].to] && !( v % fac ) ) {
dfs( v, bas, fac ), addeq( f[u], mul( f[u], f[v] ) );
}
}
} inline int solve( const int bas, const int fac ) {
for ( int i = fac; i <= n; i += fac ) if ( !vis[i] ) dfs( i, bas, fac );
int ret = 0;
for ( int i = fac; i <= n; i += fac ) addeq( ret, f[i] ), vis[i] = false;
return ret;
} int main() {
freopen( "mushroom.in", "r", stdin );
freopen( "mushroom.out", "w", stdout ); n = rint();
rep ( i, 2, n ) link( rint(), rint() ); sieve( n ); int ans = 0;
rep ( i, 1, n ) rep ( j, 1, n / i ) {
addeq( ans, ( solve( i, i * j ) * mu[j] + MOD ) % MOD );
} wint( ans ), putchar( '\n' );
return 0;
}

Solution -「多校联训」种蘑菇的更多相关文章

  1. Solution -「多校联训」I Love Random

    \(\mathcal{Description}\)   给定排列 \(\{p_n\}\),可以在其上进行若干次操作,每次选取 \([l,r]\),把其中所有元素变为原区间最小值,求能够得到的所有不同序 ...

  2. Solution -「多校联训」朝鲜时蔬

    \(\mathcal{Description}\)   Link.   破案了,朝鲜时蔬 = 超现实树!(指写得像那什么一样的题面.   对于整数集 \(X\),定义其 好子集 为满足 \(Y\sub ...

  3. Solution -「多校联训」假人

    \(\mathcal{Description}\)   Link.   一种物品有 长度 和 权值 两种属性,现给定 \(n\) 组物品,第 \(i\) 组有 \(k_i\) 个,分别为 \((1,a ...

  4. Solution -「多校联训」古老的序列问题

    \(\mathcal{Description}\)   Link.   给定序列 \(\{a_n\}\),和 \(q\) 次形如 \([L,R]\) 的询问,每次回答 \[\sum_{[l,r]\su ...

  5. Solution -「多校联训」自动机

    \(\mathcal{Description}\)   Link.   有一个状态集为 \(V\) 的自动机,状态接收 (, ) 和 _(空格) 三种字符,分别编号为 \(0,1,2\),状态 \(u ...

  6. Solution -「多校联训」取石子游戏

    \(\mathcal{Description}\)   Link.   有 \(n\) 堆石子,第 \(i\) 堆有 \(x_i\) 个,Alice 每次只能从这堆中拿走 \(a_i\) 个石子,Bo ...

  7. Solution -「多校联训」行列式

    \(\mathcal{Description}\)   Link.   给定 \(x,\{d_i\}_{i=1}^n,\{p_i\}_{i=2}^n,\{b_i\}_{i=2}^n,\{c_i\}_{ ...

  8. Solution -「多校联训」最小点覆盖

    \(\mathcal{Description}\)   Link.   求含有 \(n\) 个结点的所有有标号简单无向图中,最小点覆盖为 \(m\) 的图的数量的奇偶性.\(T\) 组数据.   \( ...

  9. Solution -「多校联训」小卖部

    \(\mathcal{Description}\)   Link.   有 \(n\) 种物品,第 \(i\) 中有 \(a_i\) 个,单价为 \(b_i\).共 \(q\) 次询问,每次查询用不超 ...

随机推荐

  1. 在CentOS7上安装 jq

    安装EPEL源: yum install epel-release 安装完EPEL源后,可以查看下jq包是否存在: yum list jq 安装jq: yum -y install jq 命令参考资料 ...

  2. XCTF-反序列化中_wakeup()函数

    跳过_wakeup()魔法函数__wakeup(): 将在序列化之后立即被调用漏洞原理: 当反序列化字符串中,表示属性个数的值大于其真实值,则跳过__wakeup()执行 对于该题,先可以看到类xct ...

  3. hisql orm update表数据更新文档

    更新 HiSql数据更新 HiSql 提供了好几种数据更新的方式下面一一介绍一下 如果你的表中增加了这四个字段 字段 描述 类型 CreateTime 创建时间 DateTime CreateName ...

  4. [FatFs 学习] SD卡总结-SPI模式

    SD卡为移动设备提供了安全的,大容量存储解决方法.它本身可以通过两种总线模式和MCU进行数据传输,一种是称为SD BUS的4位串行数据模式,另一种就是大家熟知的4线SPI Bus模式.一些廉价,低端的 ...

  5. 【刷题-LeetCode】208. Implement Trie (Prefix Tree)

    Implement Trie (Prefix Tree) Implement a trie with insert, search, and startsWith methods. Example: ...

  6. Sentry 开发者贡献指南 - 浏览器 SDK 集成测试

    Sentry 的浏览器 SDK 的集成测试在内部使用 Playwright.这些测试在 Chromium.Firefox 和 Webkit 的最新稳定版本上运行. https://playwright ...

  7. C++数据结构类型以及实现类

    1.array数组 #include<iostream> #include<array> using namespace std; int main() { array< ...

  8. 学习MyBatis必知必会(6)~Mapper基础的拓展

    一.typeAlias 类型别名[自定义别名.系统自带别名] 1.类型别名:为 Java 类型设置一个缩写名字. 它仅用于 XML 配置,意在降低冗余的全限定类名书写 2.配置自定义别名: (1)方式 ...

  9. 使用Xamarin开发移动应用示例——数独游戏(六)使用数据库

    项目代码可以从Github下载:https://github.com/zhenl/ZL.Shudu .代码随项目进度更新. 现在我们希望为应用增加更多的功能,比如记录每个完成的游戏,可以让用户自己添加 ...

  10. 资本主义反抗指南精要(v0.1)

    (1)充分预估工作时间,比如一小时的开发任务,你可以加上技术调研,API/数据库设计,单元测试,联调,集成测试等等,拖到一天,同理一天的任务可以拖到一星期. (2)简历上尽一切手段来美化,最好能包装成 ...