博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
(1009) HDU 6446 Tree and Permutation(规律+树上各个点的距离和)
阅读量:5099 次
发布时间:2019-06-13

本文共 1171 字,大约阅读时间需要 3 分钟。

题意:

给一棵N个点的树,对应于一个长为N的全排列,对于排列的每个相邻数字a和b,他们的贡献是对应树上顶点a和b的路径长,求所有排列的贡献和。

分析:

经过简单的分析可以得知,全部的贡献其实相当与(这颗树上各个点的距离之和)*jichen(n-1) *2; 

不相信可以举个简单的例子,或者用计算机打表可以知道;

那么如何求树上各个点的距离和呢?

可以参考这个博客: ; 

那下面的问题就相当的简单了;

#include
using namespace std;const int maxn = 100001;const int mod = 1e9+7;#define ll long longll sum[maxn];int n;ll dp[maxn];struct no{ int v,w;}t1,t2;vector
tree[maxn];void dfs(int cur, int father){ sum[cur] = 1; for(int i = 0; i < tree[cur].size(); i++) { int son = tree[cur][i].v; ll len = tree[cur][i].w; if(father == son) continue; dfs(son, cur); sum[cur] = (sum[cur]+sum[son])%mod; dp[cur] = ((dp[cur]+dp[son])%mod + (n-sum[son])*sum[son]%mod * len%mod)%mod; }}ll jichen(int n){ ll sum=1; while(1) { if(n==1) break; sum=(sum*n)%mod; n--; } return sum;}int main( ){ while(scanf("%d",&n)!=EOF) { for(int i=0 ; i<=n ; i++) tree[i].clear(); memset(sum,0,sizeof(sum)); memset(dp,0,sizeof(dp)); for(int i = 0 ; i
View Code

 

转载于:https://www.cnblogs.com/shuaihui520/p/9537308.html

你可能感兴趣的文章
服务端的GET、POST请求
查看>>
Python之文件操作工具
查看>>
浅谈SQLiteOpenHelper之onCreate例子
查看>>
证券市场主体
查看>>
Educational Codeforces Round 69 (Rated for Div. 2) A - DIY Wooden Ladder
查看>>
stm32之CMSIS标准、库目录、GPIO
查看>>
Dima and Lisa
查看>>
JAVA编程思想中总结的与C++的区别
查看>>
HBase基准性能测试报告
查看>>
在.NET使用JSON作为数据交换格式
查看>>
hdu-2586-How far away ?(离线LCA)
查看>>
几种常见的十进制代码(笔记)
查看>>
javase的一些基础(4)
查看>>
Objective-C类和对象总结
查看>>
laravel的phpstorm插件laravel-ide-helper
查看>>
Kth Smallest Element in a BST
查看>>
Git Submodule管理项目子模块
查看>>
修改登录密码
查看>>
Android中shape的使用
查看>>
(转)解决点击a标签返回页面顶部的问题
查看>>