【題目鏈結】:
【題意】
【題解】
有個方差的公式 v(
x)=e
(x2)
−e(x
)2這裡e(x)指的是x的期望;
顯然所有樹的度數的期望都是2*(n-1)/n
則問題轉換成求e(x^2)了;
這裡用到了樹的prufer數列->關於prufer數列
即每乙個prufer數列都對應了不同的樹;
然後根據數列中的數字出現的次數和其在樹中的度數的關係;
我們可以列舉每乙個節點在prufer數列**現的次數x;
在n-2個位置中選x個位置放這個節點->c(n-2,x)
則剩餘n-2-x個位置,每個位置都有n-1種選擇即(n-1)^(n-2-x)
然後它的度數就是x+1,因為求的是x方的期望,所以累加度數的時候加的是(x+1)^2
然後有n個節點,每個節點都可以這樣,所以再乘個n;
這樣我們就算出了;
所有n個節點的樹;
所有節點的度數的平方的和;
則再除個n就是e(x^2)了;
分數的取模其實就是用乘法逆元搞;
和能整除的分數一樣;
階乘的乘法逆元求的時候只要求最大的那個,小的直接列舉就能得到;
【number ofwa】
3 【完整**】
#include
using
namespace
std;
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
#define ll long long
#define rep1(i,a,b) for (int i = a;i <= b;i++)
#define rep2(i,a,b) for (int i = a;i >= b;i--)
#define mp make_pair
#define pb push_back
#define fi first
#define se second
#define ms(x,y) memset(x,y,sizeof x)
typedef pair pii;
typedef pairpll;
const
int dx[9] = ;
const
int dy[9] = ;
const
double pi = acos(-1.0);
const
int n = 1e6+100;
const ll mod = 998244353;
ll fac[n],***c[n],ans = 0,n,pre[n],ex;
ll ksm(ll x,ll y)
return t;
}ll c(ll n,ll m)
int main()
ans = (ans+mod-ex*ksm(n,mod-2)%mod)%mod;
ans = ans*ksm(n,mod-2)%mod;
cout
<< ans << endl;
return
0;}
hihoCoder 1014 Trie樹(字典樹)
1014 trie樹 時間限制 10000ms 單點時限 1000ms 記憶體限制 256mb 描述 小hi和小ho是一對好朋友,出生在資訊化社會的他們對程式設計產生了莫大的興趣,他們約定好互相幫助,在程式設計的學習道路上一同前進。這一天,他們遇到了一本詞典,於是小hi就向小ho提出了那個經典的問題...
字典樹模板(HihoCoder 1014)
include using namespace std struct nodetr 1000010 陣列大小開n 插入最多單詞個數 l 最長單詞長度 int num 0 void tr insert char s rt tr rt z id tr rt sum 標記前面字元相同,以s i 結尾的單詞...
hihoCoder 1116 計算 線段樹
題意 描述現在有乙個有n個元素的陣列a1,a2,an。記f i,j ai ai 1 aj。初始時,a1 a2 an 0,每次我會修改乙個ai的值,你需要實時反饋給我 f i,j 1 i j n 的值 mod 10007。輸入第一行包含兩個數n 1 n 100000 和q 1 q 500000 接下來...