【题目描述】

noip要到了,大家来到许愿树前。这个许愿树不仅仅是许愿树,还有未卜先知的功能。众OIer问许愿树:“不平凡的许愿树,CCF告诉我们noip中会有两道题目从Openjudge上选择,你能不能告诉我是哪两道题。”

许愿树想了想直接说出答案并不妥:“中国有句古话叫‘闷声大发财’,我就什么也不说,这是最好的。但是我看到你们这么热情,一句话不说也不好,我就告诉你
们点信息吧。你们看我是一个由N个结点组成的树,在树中任选着3个点,有多少种选择方案使得这三个点互相之间的距离相同?两个方案不同当且仅当一个点在第
一种方案中被选择,第二种方案中没有被选择。”

“记你算出来方案数为cnt,那么第一道题的题号就是cnt%338 + 1,第二题的题目编号是(cnt+233)%338+1。”

可是OIer们手头并没有计算机,于是请你来告诉他们题目编号。

【输入格式】

第一行一个整数N,表示树有N个点。

接下来N-1行,每行两个整数u,v,表示树中有一条从u到v的边

【输出格式】

一行,两个整数,分别为预测的第一题题号和第二题题号。

【样例输入】

7
1 2
5 7
2 5
2 3
5 6
4 5

【样例输出】

6 239

【提示】

样例解释:

共有5种方案,分别是{1,3,5},{2,4,6},{2,4,7},{2,6,7},{4,6,7}。所以第一题的编号为5%338 + 1 = 6;第二题的编号为(5+233)%338 + 1 = 239;

数据范围与约定:

对于30%的数据:1 <= n <= 100

对于60%的数据:1 <= n <= 1500

对于100%的数据:1 <= n <= 5000

胡扯:

其实Openjudge没有确切题号,第1.1节有10题,第1.2节有10题...,不如约定第16题的编号是第1.2节的第6题。如果命中我什么都不知道。

题解:

  这个题目思路还是比较清晰的。首先我们要知道一个结论,显然树上三点相互之间的最短路径的焦点有且只有一个。

  那么这个题目就比比较好做了,我们可以枚举那个中心点然后算总方案数-不合法的方案数。

  具体怎么做呢?可以考虑枚举每个点,以他为根dfs,求出每一层的点数(深度相同),然后显然总方案数等于所有的点在每一层选三个的组合数,相加。当然有不和法的情况:1.如果选中的三个点在同一棵子树里面的话那么显然就不和法。2.如果在一棵子数里面选了两个点,在另一棵子树又选一个点那么也是不合法的。那么我们每次dfs每个子树算一下对应的组合数就可以了。

代码:

#include <cstdio>
#include <iostream>
#include <algorithm>
#include <cstring>
#include <cmath>
#include <iostream>
#include <queue>
#define ll long long
#define MAXN 5010
#define mod 338
using namespace std;
struct edge{
int first;
int next;
int to;
}a[MAXN*];
int c[MAXN][MAXN],dep[MAXN],dis[MAXN];
int n,num=;
ll ans=; inline void addedge(int from,int to){
a[++num].to=to;
a[num].next=a[from].first;
a[from].first=num;
} inline void dfs(int now,int f,int d,int *dep){
++dep[d];
for(int i=a[now].first;i;i=a[i].next){
int to=a[i].to;
if(to==f) continue;
dfs(to,now,d+,dep);
}
} inline void pre(){
c[][]=;
for(int i=;i<=n;i++){
c[i][]=;
for(int j=;j<=i;j++) c[i][j]=(c[i-][j-]+c[i-][j])%mod;
}
} int main()
{
scanf("%d",&n);
for(int i=;i<n;i++){
int x,y;scanf("%d%d",&x,&y);
addedge(x,y);
addedge(y,x);
}
pre();
for(register int now=;now<=n;now++){
for(register int i=;i<=n;i++) dep[i]=;
dfs(now,,,dep);
for(register int k=;k<=n;k++) ans+=c[dep[k]][]%=mod;
for(int i=a[now].first;i;i=a[i].next){
int to=a[i].to;
for(register int i=;i<=n;i++) dis[i]=;
dfs(to,now,,dis);
for(register int k=;k<=n;k++) ans+=mod-(c[dis[k]][]+c[dis[k]][]*(dep[k]-dis[k]))%mod;
if(ans>=mod) ans-=mod;
}
}
printf("%lld %lld",ans%mod+,(ans+)%mod+);
return ;
}

COGS 2096. 不平凡的许愿树的更多相关文章

  1. cogs 2554. [福利]可持久化线段树

    题目链接 cogs 2554. [福利]可持久化线段树 题解 没有 代码 #include<cstdio> #include<cstring> #include<algo ...

  2. COGS.1822.[AHOI2013]作业(莫队 树状数组/分块)

    题目链接: COGS.BZOJ3236 Upd: 树状数组实现的是单点加 区间求和,采用值域分块可以\(O(1)\)修改\(O(sqrt(n))\)查询.同BZOJ3809. 莫队为\(O(n^{1. ...

  3. COGS 2095. 不平凡的引线

    2095. 不平凡的引线 ★☆   输入文件:firelead.in   输出文件:firelead.out   简单对比 时间限制:1 s   内存限制:256 MB [题目描述] 这里说的引线是炮 ...

  4. 【BZOJ 1901】Zju2112 Dynamic Rankings &&【COGS 257】动态排名系统 树状数组套线段树

    外面是树状数组,里面是动态开点线段树,对于查询我们先把有关点找出来,然后一起在线段树上行走,这样就是单个O(log2)的了 #include <cstdio> #include <v ...

  5. cogs 1143. [石门中学2009] 切割树

    1143. [石门中学2009] 切割树 ★   输入文件:treecut.in   输出文件:treecut.out   简单对比时间限制:1 s   内存限制:128 MB treecut 题目描 ...

  6. Cogs 1345. [ZJOI2013] K大数查询(树套树)

    [ZJOI2013] K大数查询 /* 树套树写法. bzoj过不了. 可能有负数要离散吧. 线段树套线段树. 外层权值线段树,内层区间线段树维护标记. 对权值建一棵权值线段树. 某个点表示权值在某个 ...

  7. cogs 293. [NOI 2000] 单词查找树 Trie树字典树

    293. [NOI 2000] 单词查找树 ★★☆   输入文件:trie.in   输出文件:trie.out   简单对比时间限制:1 s   内存限制:128 MB 在进行文法分析的时候,通常需 ...

  8. cogs 186. [USACO Oct08] 牧场旅行 树链剖分 LCA

    186. [USACO Oct08] 牧场旅行 ★★☆   输入文件:pwalk.in   输出文件:pwalk.out   逐字节对比时间限制:1 s   内存限制:128 MB n个被自然地编号为 ...

  9. cogs 1963. [HAOI 2015] 树上操作 树链剖分+线段树

    1963. [HAOI 2015] 树上操作 ★★★☆   输入文件:haoi2015_t2.in   输出文件:haoi2015_t2.out   简单对比时间限制:1 s   内存限制:256 M ...

随机推荐

  1. Storm 系列(一)—— Storm和流处理简介

    一.Storm 1.1 简介 Storm 是一个开源的分布式实时计算框架,可以以简单.可靠的方式进行大数据流的处理.通常用于实时分析,在线机器学习.持续计算.分布式 RPC.ETL 等场景.Storm ...

  2. JavaBean的学习

    一.什么是JavaBean JavaBean是一个遵循特定写法的Java类,它通常具有如下特点: 这个Java类必须具有一个无参的构造函数 属性必须私有化. 私有化的属性必须通过public类型的方法 ...

  3. [大数据学习研究] 3. hadoop分布式环境搭建

    1. Java安装与环境配置 Hadoop是基于Java的,所以首先需要安装配置好java环境.从官网下载JDK,我用的是1.8版本. 在Mac下可以在终端下使用scp命令远程拷贝到虚拟机linux中 ...

  4. Can't connect to MySQL server on 'localhost' (10038)

    平台:win7 已经安装好数据库,但是 在连接MySQL数据库时发生问题: 经过一系列的资料查找后,得到结论MySQL没有启动 解决方法: 将MySQL加入到Windows的服务中.切换到MySQL安 ...

  5. EasySwoole+ElasticSearch打造 高性能 小视频服务系统

    EasySwoole+ElasticSearch打造高性能小视频服务 第1章 课程概述 第2章 EasySwoole框架快速上手 第3章 性能测试 第4章 玩转高性能消息队列服务 第5章 小视频服务平 ...

  6. 记录工作中linux相关操作

    在项目部署之后,查看日志能查看部署结果是否正确部署. 最开始查看日志我会使用cat service.log tail -f service.log vim service.log 打开日志之后 /+查 ...

  7. Docker学习之Dockerfile

    通过编写简单的文件创建docker镜像 dockerfile 用来创建docker镜像. 格式 : FROM alpine:latest MAINTAINER XSW CMD echo "h ...

  8. 从 HTTP/1 到 HTTP/2,以及即将到来的 HTTP/3

    如今的生活中已经离不开互联网,智能家居.在线支付.网上购物都需要互联网的支持.互联网切切实实地给生活带来了诸多便利.有了互联网,我们可以呆在空调房里,一边刷着微博,一边等透心凉的西瓜送到手上,安安静静 ...

  9. opencv调整图像亮度对比度

    图像处理 图像变换就是找到一个函数,把原始图像矩阵经过函数处理后,转换为目标图像矩阵. 可以分为两种方式,即像素级别的变换和区域级别的变换 Point operators (pixel transfo ...

  10. Python学习-列表深浅拷贝

    一.先看一个简单的赋值语句 lst1 = ['France', 'Belgium', 'England'] lst2 = lst1 # lst1.append('Uruguay') lst2.appe ...