hihoCoder挑战赛28题目3 : 树的方差

Posted 神犇(shenben)

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了hihoCoder挑战赛28题目3 : 树的方差相关的知识,希望对你有一定的参考价值。

题目3 : 树的方差

时间限制:20000ms
单点时限:1000ms
内存限制:256MB

描述

对于一棵 n 个点的带标号无根树,设 d[i] 为点 i 的度数。

定义一棵树的方差为数组 d[1..n] 的方差

给定 n ,求所有带标号的 n 个点的无根树的方差之和。

你需要将答案对 998244353 取模。

方差的定义:https://en.wikipedia.org/wiki/Variance

输入

仅一行:一个正整数 n

2 ≤ n ≤ 106

输出

仅一行:一个非负整数表示答案

样例解释

3个点的无根树有3种,每种的度数分布都是[1,2,1]

于是方差=((1-(4/3))2+(2-(4/3))2+(1-(4/3))2)/3=2/9

由于有3种,所以答案是2/3

分数取模的方法:https://math.stackexchange.com/questions/586595/finding-modular-of-a-fraction

样例输入
3
样例输出
665496236
#include<cstdio>
#include<iostream>
using namespace std;
typedef long long ll;
const ll mod=998244353;
ll fpow(ll a,ll p){
    ll res=1;
    for(;p;p>>=1,a=a*a%mod) if(p&1) res=res*a%mod;
    return res;
}
ll n,tem,ans;
int main(){
    cin>>n;
    ans=(n-2)*(n-1)%mod;
    if(n<=3){
        tem=fpow(n,mod-2);
        ans=ans*tem%mod;
        cout<<ans<<\n;
        return 0;
    }
    tem=fpow(n,n-4);
    ans=ans*tem%mod;
    cout<<ans<<\n;
    return 0;
}

 

以上是关于hihoCoder挑战赛28题目3 : 树的方差的主要内容,如果未能解决你的问题,请参考以下文章

hihoCoder挑战赛28 题目1 : 异或排序

hihoCoder挑战赛1 毁灭者问题

hihoCoder 1048 : 状态压缩·二

[hihocoder 1050]求树的最长链

hihocoder [Offer收割]编程练习赛14可疑的记录

hihocoder 1342 Full Binary Tree Picture完全二叉树