给定一棵有n个节点的无根树,树上的每个点有一个非负整数点权。定义一条路径的价值为路径上的点权和-路径上的点权最大值。 给定参数 P P P,我们想知道,有多少不同的树上简单路径,满足它的价值恰好是 P P P的倍数。 注意:单点算作一条路径; u ! = v u!=v u!=v时, ( u , v ) (u,v) (u,v)和 ( v , u ) (v,u) (v,u)只算一次。
n < = 1 e 5 , P < = 1 e 7 n<=1e5 , P<=1e7 n<=1e5,P<=1e7
这个,智商压制题。
其实只需要点分治之后按路径最大值排序,再来个简单的子树内去重即可。
A C C o d e \rm AC\ Code AC Code
#include<bits/stdc++.h>
#define maxn 100005
#define LL long long
using namespace std;
int n,P,a[maxn