P2634 [国家集训队]聪聪可可

题目描述

聪聪和可可是兄弟俩,他们俩经常为了一些琐事打起来,例如家中只剩下最后一根冰棍而两人都想吃、两个人都想玩儿电脑(可是他们家只有一台电脑)……遇到这种问题,一般情况下石头剪刀布就好了,可是他们已经玩儿腻了这种低智商的游戏。

他们的爸爸快被他们的争吵烦死了,所以他发明了一个新游戏:由爸爸在纸上画n个“点”,并用n-1条“边”把这n个“点”恰好连通(其实这就是一棵树)。并且每条“边”上都有一个数。接下来由聪聪和可可分别随即选一个点(当然他们选点时是看不到这棵树的),如果两个点之间所有边上数的和加起来恰好是3的倍数,则判聪聪赢,否则可可赢。

聪聪非常爱思考问题,在每次游戏后都会仔细研究这棵树,希望知道对于这张图自己的获胜概率是多少。现请你帮忙求出这个值以验证聪聪的答案是否正确。

输入格式

输入的第1行包含1个正整数n。后面n-1行,每行3个整数x、y、w,表示x号点和y号点之间有一条边,上面的数是w。

输出格式

以即约分数形式输出这个概率(即“a/b”的形式,其中a和b必须互质。如果概率为1,输出“1/1”)。

输入输出样例

输入 #1复制

5
1 2 1
1 3 2
1 4 1
2 5 3
输出 #1复制

13/25

说明/提示

【样例说明】

13组点对分别是(1,1) (2,2) (2,3) (2,5) (3,2) (3,3) (3,4) (3,5) (4,3) (4,4) (5,2) (5,3) (5,5)。

【数据规模】

对于100%的数据,n<=20000。

sol:树形dp即可,也可以点分(很久前写的(大雾,dp[i][j]表示以i为根的子树中到i的和%i=j的个数

#include <bits/stdc++.h>
using namespace std;
typedef int ll;
inline ll read()
{
ll s=; bool f=; char ch=' ';
while(!isdigit(ch)) {f|=(ch=='-'); ch=getchar();}
while(isdigit(ch)) {s=(s<<)+(s<<)+(ch^); ch=getchar();}
return (f)?(-s):(s);
}
#define R(x) x=read()
inline void write(ll x)
{
if(x<) {putchar('-'); x=-x;}
if(x<) {putchar(x+''); return;}
write(x/); putchar((x%)+'');
}
#define W(x) write(x),putchar(' ')
#define Wl(x) write(x),putchar('\n')
const int N=,M=;
int n,dp[N][],ans=;
int tot=,Next[M],to[M],val[M],head[N];
inline void Link(int x,int y,int z){Next[++tot]=head[x]; to[tot]=y; val[tot]=z; head[x]=tot;}
inline void dfs(int x,int fat)
{
int e,i,j;
dp[x][]=; dp[x][]=dp[x][]=;
for(e=head[x];e;e=Next[e]) if(to[e]!=fat)
{
dfs(to[e],x);
for(i=;i<;i++)
{
ans+=dp[x][i]*dp[to[e]][(-i-val[e])%]*;
}
for(i=;i<;i++)
{
dp[x][(i+val[e])%]+=dp[to[e]][i];
}
}
// cout<<x<<' '<<dp[x][0]<<' '<<dp[x][1]<<' '<<dp[x][2]<<endl;
}
int main()
{
int i,x,y,z;
R(n);
for(i=;i<n;i++)
{
R(x); R(y); z=read()%; Link(x,y,z); Link(y,x,z);
}
dfs(,);
ans+=n;
int gg=__gcd(n*n,ans);
write(ans/gg); putchar('/'); Wl(n*n/gg);
return ;
}
/*
input
5
1 2 1
1 3 2
1 4 1
2 5 3
output
13/25
*/
#include <cstdio>
#include <algorithm>
using namespace std;
const int N=,M=,inf=0x3f3f3f3f;
int n,re=,tot=,Next[M],to[M],val[M],head[M],rt,sum,sz[N],pp[N],arr[N],tong[],gg;
inline void add(int x,int y,int z){Next[++tot]=head[x];to[tot]=y;val[tot]=z;head[x]=tot;}
inline int gcd(int x,int y){return (y==)?x:gcd(y,x%y);}
inline void getrt(int x,int fa)
{
int i; sz[x]=; pp[x]=;
for(i=head[x];i;i=Next[i])
{
if(!arr[to[i]]&&to[i]!=fa){getrt(to[i],x); sz[x]+=sz[to[i]]; pp[x]=max(pp[x],sz[to[i]]);}
}pp[x]=max(pp[x],sum-pp[x]); if(pp[x]<pp[rt])rt=x;
}
inline void dfs(int x,int fa,int pre)
{
tong[pre]++; int i;
for(i=head[x];i;i=Next[i])
{
if(to[i]!=fa&&!arr[to[i]])dfs(to[i],x,(pre+val[i])%);
}
}
inline void calc(int x,int op,int v)
{
tong[]=tong[]=tong[]=; dfs(x,,v%); re+=op*(*tong[]*tong[]+tong[]*tong[]+tong[]+tong[]);
}
inline void solve(int x)
{
int i; arr[x]=; calc(x,,);
for(i=head[x];i;i=Next[i])
{
if(!arr[to[i]])
{
calc(to[i],-,val[i]); sum=sz[to[i]]; pp[rt=]=inf; getrt(to[i],); solve(rt);
}
}
}
int main()
{
int i,x,y,z; scanf("%d",&n); sum=pp[rt=]=n;
for(i=;i<n;i++)
{
scanf("%d%d%d",&x,&y,&z); add(x,y,z); add(y,x,z);
}getrt(,); solve(rt); gg=gcd(re,n*n); printf("%d/%d\n",re/gg,n*n/gg);
}

点分

luogu2634的更多相关文章

  1. luogu2634 聪聪可可 (树形dp)

    要求出两点间距离==0(mod3) 的数量,然后除以(n*n) 设f[i][j]为i的子树到i的距离==j(mod3)的数量,然后做树形dp即可 因为要最简,所以要求一下gcd,然后除下去 #incl ...

  2. luogu2634 聪聪可可

    点分治裸题 #include <iostream> #include <cstdio> using namespace std; int n, uu, vv, ww, ans, ...

随机推荐

  1. python 修改文件的创建时间、修改时间、访问时间

    目录 python 修改文件创建.修改.访问时间 方案一 方案二(无法修改文件创建时间) python 修改文件创建.修改.访问时间 突如其来想知道一下 python 如何修改文件的属性(创建.修改. ...

  2. analysis_tools

  3. Prometheus Operator 自动发现和持久化

    Prometheus Operator 自动发现和持久化 之前在 Prometheus Operator 下面自定义一个监控选项,以及自定义报警规则的使用.那么我们还能够直接使用前面课程中的自动发现功 ...

  4. python经典小程序集锦(一) 实现九九乘法表

    本篇文章主要是收集整理一些小程序以供大家娱乐,或者是在面试的时候使用到.文章会持续更新,希望大家收藏关注哦. 1.代码实现过程 for i in range(1, 10): for j in rang ...

  5. 移植 Linux 内核

    目录 更新记录 1.Linux 版本及特点 2.打补丁.编译.烧写.启动内核 3.内核源码文件结构 4.内核架构分析 4.1 内核配置 4.2 Makefile架构分析 4.3 Kconfig 架构文 ...

  6. requests模块发送数据

    通过json dumps发送 import requests import json def agent(): """ 执行命令采集硬件信息 将执行的信息发送给API : ...

  7. 【Day3】4.Xpath语法与案例

    课程目标 1.谷歌浏览器配置Xpath 2.Xpath常用语法 3.Xpath常用案例 1.谷歌浏览器配置Xpath Xpath下载:http://chromecj.com/web-developme ...

  8. docker-compose 编排文件小疑点

    在学习docker-compose的时候,查看了下st2中的docker-compose.yml文件,有个地方没搞明白 env_file 制定的文件路径,一开始以为是在对应的容器中的conf目录中,但 ...

  9. webstorm 注册服务器

    之前都是使用2017.2.27的方法,版本是2017.1.1,还没提示过期,但是根据评论说这个链接已经失效了,评论也给出了个新地址:http://idea.iteblog.com/key.php

  10. 解决docker容器开启端口映射后,会自动在防火墙上打开端口的问题

    在docker中运行第三方服务时,通常需要绑定服务端口到本地主机.但使用 -p 参数进行的端口映射,会自动在iptables中建立规则,绕过firewalld,这对于端口级的黑白名单控制管理是很不利的 ...