【题目描述】

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. 【Spring】容器刷新(refresh)流程解析

    一.概述 二.prepareRefresh() 三.obtainFreshBeanFactory() 四.prepareBeanFactory(beanFactory); 五.postProcessB ...

  2. 【DataBase】事务

    一.事务概述 二.事务的四大特性(ACID) 三.事务的隔离性导致的问题 四.数据库的四个隔离级别 五.数据库中的锁机制: 六.更新丢失 七.并发事务所带来的的问题 一.事务概述 事务的概念:事务是指 ...

  3. linux安装python串口工具pyserial遇到不能成功导入的问题

    常规方法:pip install pyserial导入serial后提示: 解决方法:apt install python3-serial 参考:https://stackoverflow.com/q ...

  4. zookeeper与kafka集群部署实现

    ZooKeeper是一个分布式的,开放源码的分布式应用程序协调服务,是Google的Chubby一个开源的实现,它是集群的管理者,监视着集群中各个节点的状态根据节点提交的反馈进行下一步合理操作.最终, ...

  5. Python连载38-协程、可迭代、迭代器、生产者消费者模型

    一.生产者消费者模型 import multiprocessing from time import ctime def consumer(input_q): print("Into con ...

  6. 使用Bookinfo应用测试Kuma服务网格

    最近,开源API管理平台Kong服务供应商近日放出了新的开源项目Kuma.本文尝试将 bookinfo 应用部署在 Kuma 网格中,以便帮助大家更好的理解 Kuma 项目.   Kuma是能用于管理 ...

  7. 松软科技课堂:SQL--UNIQUE约束

    SQL UNIQUE 约束(文章来源:松软科技-www.sysoft.net.cn-) UNIQUE 约束唯一标识数据库表中的每条记录. UNIQUE 和 PRIMARY KEY 约束均为列或列集合提 ...

  8. Python—字符串和常用数据结构

    目录 1. 字符串 2. 列表 2.1 列表的增删改查 2.2 列表的切片和排序 2.3 生成式语法 3. 元组 4.集合 5. 字典 5.1 字典的增删改查 5.2 字典的常见操作 序言:这一章我们 ...

  9. Day 18 软件管理3之搭建网络仓库

    搭建一个网络仓库 服务端: 10.0.0.200   1.准备软件包( 1.光盘 2.缓存 3.联网下载 4.同步 ) 2.通过p共享软件包存放的目录 3.将光盘中的软件包都拷贝至p的共享目录下 4. ...

  10. [Pandas] 06 - Data Preprocessing and Cleaning

    From: DBWangGroup 基于该系列代码的实践与补充思考. 补充:特征工程 结合:[Scikit-learn] 4.3. Preprocessing data /* implement */