重点学科网站建设dw怎么做秋季运动会网站
重点学科网站建设,dw怎么做秋季运动会网站,dw如何做网站界面,国家电网公司人力资源招聘平台题意#xff1a;
一颗n个点的树#xff0c;问其中两点之间的边上数的和加起来是3的倍数的点对有多少个#xff1f; 输出这样的点对所占比例
题解#xff1a;
树形dp求解 因为是求长度为3的倍数#xff0c;模3的结果只有0/1/2#xff0c;我们可以单独考虑作为一维。 设…题意
一颗n个点的树问其中两点之间的边上数的和加起来是3的倍数的点对有多少个 输出这样的点对所占比例
题解
树形dp求解 因为是求长度为3的倍数模3的结果只有0/1/2我们可以单独考虑作为一维。 设dp[i][j]表示从i的子树里任选一点到i的路径长度(mod 3)为j的方案数 有转移 v是u的儿子节点 j∈0,1,2j∈0,1,2j∈0,1,2 dp[u][j]∑dp[v][(jdist(u,v))mod3]dp[u][j]\sum dp[v][(jdist(u,v))\mod3]dp[u][j]∑dp[v][(jdist(u,v))mod3] 简化下 dp[u][(jdist(u,v))mod3]dp[v][j]dp[u][ (jdist(u,v) )\mod 3]dp[v][j]dp[u][(jdist(u,v))mod3]dp[v][j] 怎么得到的 到v的距离是j那到u的距离不就是jdist(u,v) 统计答案时我们设点x和y符合要求(如图)说明x到u的距离与y到u的距离和是3的倍数即(iwj)%30即j(3-i-w)%3,我们枚举i然后看对应的j有多少数量相乘(乘法原理)
代码
#include bits/stdc.h
#include unordered_map
#define debug(a, b) printf(%s %d\n, a, b);
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
typedef pairint, int PII;
clock_t startTime, endTime;
//Fe~Jozky
const ll INF_ll 1e18;
const int INF_int 0x3f3f3f3f;
void read(){};
template typename _Tp, typename... _Tps void read(_Tp x, _Tps... Ar)
{x 0;char c getchar();bool flag 0;while (c 0 || c 9)flag| (c -), c getchar();while (c 0 c 9)x (x 3) (x 1) (c ^ 48), c getchar();if (flag)x -x;read(Ar...);
}
template typename T inline void write(T x)
{if (x 0) {x ~(x - 1);putchar(-);}if (x 9)write(x / 10);putchar(x % 10 0);
}
void rd_test()
{
#ifdef LOCALstartTime clock();freopen(in.txt, r, stdin);
#endif
}
void Time_test()
{
#ifdef LOCALendTime clock();printf(\nRun Time:%lfs\n, (double)(endTime - startTime) / CLOCKS_PER_SEC);
#endif
}
const int maxn 1e5 9;
int dp[maxn][3];
int ans 0;
vectorPII vec[maxn];
int mod(int x)
{return (x % 3 3) % 3;
}
void dfs(int u, int fa)
{dp[u][0] 1;for (auto it : vec[u]) {int v it.first;int w it.second;if (v fa)continue;dfs(v, u);for (int i 0; i 3; i) {ans dp[v][i] * dp[u][mod(3 - i - w)] * 2;}for (int i 0; i 3; i) {dp[u][mod(i w)] dp[v][i];}}
}
int main()
{//rd_test();int n;read(n);for (int i 1; i n; i) {int u, v, w;read(u, v, w);vec[u].push_back({v, w});vec[v].push_back({u, w});}dfs(1, -1);ll a ans n;ll b 1ll * n * n;ll g __gcd(a, b);printf(%lld/%lld\n, a / g, b / g);//Time_test();
}
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/92033.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!