luogu2634
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”)。
输入输出样例
5
1 2 1
1 3 2
1 4 1
2 5 3
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的更多相关文章
- luogu2634 聪聪可可 (树形dp)
要求出两点间距离==0(mod3) 的数量,然后除以(n*n) 设f[i][j]为i的子树到i的距离==j(mod3)的数量,然后做树形dp即可 因为要最简,所以要求一下gcd,然后除下去 #incl ...
- luogu2634 聪聪可可
点分治裸题 #include <iostream> #include <cstdio> using namespace std; int n, uu, vv, ww, ans, ...
随机推荐
- User space(用户空间) 与 Kernel space(内核空间)
出处: User space 与 Kernel space (整理)用户空间_内核空间以及内存映射 学习 Linux 时,经常可以看到两个词:User space(用户空间)和 Kernel spac ...
- spring配置文件和spring mvc配置文件的区别
Question: Are applicationContext.xml and spring-servlet.xml related anyhow in Spring Framework? Will ...
- JAVA中线程到底起到什么作用!
这是javaeye上非常经典的关于线程的帖子,写的非常通俗易懂的,适合任何读计算机的同学. 线程同步 我们可以在计算机上运行各种计算机软件程序.每一个运行的程序可能包括多个独立运行的线程(Thread ...
- java8【一、lambda表达式语法】
特点 lambda表达式允许将函数作为方法的参数 lambda表达式更加简洁 特征 可选类型声明:不需要声明参数类型,编译器可以统一识别参数值. 可选的参数圆括号:一个参数无需定义圆括号,但多个参数需 ...
- Spring mvc 参数半丁
http://blog.csdn.net/eson_15/article/details/51718633 众所周知,springmvc是用来处理页面的一些请求,然后将数据再通过视图返回给用户的,前面 ...
- Linux与Windows的设备驱动模型对比
Linux与Windows的设备驱动模型对比 名词缩写: API 应用程序接口(Application Program Interface ) ABI 应用系统二进制接口(Application Bi ...
- [转载]AdaBoost算法
[转载]AdaBoost算法 原文:https://blog.csdn.net/v_july_v/article/details/40718799 这里就不转载了,到原文看吧.但是有几点可以注意下: ...
- plsql developer字符集和oracle字符集不一致的解决方法(转)
如果oracle安装选择的字符集与PLSQL Developer的字符集不同,则打开 PLSQL Developer时会提示字符不一致可能造成问题: 定位到注册表的以下位置: HKEY_LOCAL_M ...
- php实现多进程、多线程
孤儿进程:一个父进程退出,而它的一个或多个子进程还在运行,那么那些子进程将成为孤儿进程.孤儿进程将被init进程(进程号为1)所收养,并由init进程对它们完成状态收集工作. 僵尸进程:一个进程使用f ...
- vue报类似警告Computed property "isLoading" was assigned to but it has no setter
一.原因:一个计算属性,当计算传入的是一个函数,或者传入的是一个对象,而没有设置 setter,也就是 set 属性,当你尝试直接该改变这个这个计算属性的值,都会报这个警告,vuex还会出现通过com ...