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. Delphi编译器属性(特别修饰符Ref,Unsafe,Volatile,Weak)

    1 Refdelphi中常量参数就像一个本地常量,或者说只读变量.常量参数与值参数类似,除了不能在过程或函数体内给常量参数赋值,并且不能将常量参数传给另一个var类型参数.(但是,如果你常量参数传递的 ...

  2. VBA学习资料分享-2

    想利用VBA自动创建/发送OUTLOOK邮件,可以借助MailItem的Body属性或HTMLBody属性,代码模板如下: Dim objOutlook As Outlook.Application ...

  3. C++性能榨汁机之无锁编程

    C++性能榨汁机之无锁编程 来源 http://irootlee.com/juicer_lock_free/ 前言 私以为个人的技术水平应该是一个螺旋式上升的过程:先从书本去了解一个大概,然后在实践中 ...

  4. HTML Ueditor图片宽度超出编辑器

    问题描述 Ueditor上传图片宽度尺寸超出编辑器宽度,显示异常 解决方案 ueditor.all.js 添加img宽度限制(搜索body{margin:8px;font-family:sans-se ...

  5. 微信Emoji表情代码大全

    参考网址 因PC端微信表情包不全,部分表情在PC中有显示问题,手机端微信不存在此问题,或者可以使用文字[微笑]这种方式添加微信表情 含义 标准 DoCoMo KDDI 软银 谷歌 微信 ✂复制这列

  6. jq国际化i18n

    1.(main.js或)ajax.js引入文件 import './jquery.i18n.properties.min' //https://github.com/jquery-i18n-prope ...

  7. 转载:Java:字节流和字符流(输入流和输出流)

    本文内容: 什么是流 字节流 字符流 首发日期:2018-07-24 什么是流 流是个抽象的概念,是对输入输出设备的抽象,输入流可以看作一个输入通道,输出流可以看作一个输出通道. 输入流是相对程序而言 ...

  8. dedeampz 套件关于PHP开启curl方法

    php开启curl方法主要用到三个文件libeay32.dll,php_curl.dll,ssleay32.dll 打开dede的安装目录,更改对应版本PHP中的php.ini文件,在 ; exten ...

  9. 【CQOI2017】老C的方块

    Description https://loj.ac/problem/3022 Solution 他讲得很清楚 将那篇博客中的红色标号为 \(0\),黄色为 \(1\),蓝色为 \(2\),绿色为 \ ...

  10. MyBatis-07-分页

    7.分页 思考:为什么要分页? 减少数据的处理量 7.1.使用Limit分页 select * from user limit startIndex,pageSize 使用Mybatis实现分页,核心 ...