「模擬賽20180406」膜樹 prufer編碼+概率

来源:https://www.cnblogs.com/ModestStarlight/archive/2018/04/06/8728251.html
-Advertisement-
Play Games

題目描述 給定一個完全圖,保證$w_{u,v}=w_{v,u}$且$w_{u,u}=0$,等概率選取一個隨機生成樹,對於每一對$(u,v)$,求$dis(u,v)$的期望值對$998244353$取模。 輸入 第一行一個數$n$ 接下來$n$行,每行$n$個整數,第$i$行第$j$個整數表示$w_{ ...


題目描述

給定一個完全圖,保證\(w_{u,v}=w_{v,u}\)\(w_{u,u}=0\),等概率選取一個隨機生成樹,對於每一對\((u,v)\),求\(dis(u,v)\)的期望值對\(998244353\)取模。

輸入

第一行一個數\(n\)

接下來\(n\)行,每行\(n\)個整數,第\(i\)行第\(j\)個整數表示\(w_{i,j}\)

輸出

輸出共\(n\)行,每行\(n\)個整數,第\(i\)行第\(j\)個整數表示\(dis(i,j)\)的期望值

樣例

樣例輸入

4
0 1 1 1
1 0 1 1
1 1 0 1
1 1 1 0

樣例輸出

0 374341634 374341634 374341634
374341634 0 374341634 374341634
374341634 374341634 0 374341634
374341634 374341634 374341634 0

數據範圍

\(\left|w_{i,j}\right| \leq 10^9\)

\(n \leq 1000\)

題解

這是一道神奇的概率題……

其實題目原來是有一個\(20%\)的數據點,此時\(n\leq 9\),顯然我們可以用\(prufer\)編碼枚舉生成樹,然後暴力算答案即可(\(QwQ\)卡常拿了\(15pts\)走人)。但是顯然\(1000\)是不可能的……

於是我們考慮這道題的特殊性質——這是一個完全圖!完全圖擁有非常好的對稱性!
根據上面這點,對於點對\((u,v)\),任意的一條邊\((x,y)\)出現在\(u\)\(v\)的路徑上的概率是一樣的,同理,任意一條邊\((u,x)\)\((x,v)\)出現在\(u\)\(v\)的路徑上的概率也是一樣的。於是我們發現可以把邊分成三類。

  1. \((u,v)\),即兩端點都在路徑上
  2. \((u,x)\)\((x,v)\),即有一個端點在路徑上
  3. \((x,y)\),即兩端點都不在路徑上

對於第一種,只要這條邊出現在生成樹中就一定會經過,於是就是某一條邊出現在生成樹中的概率。生成樹有\(n^{n-2}\)種,每種會給\((n-1)\)條邊帶來\(1\)貢獻,顯然每條邊的總貢獻是相同的,於是單條邊的貢獻為\(\frac{n^{n-2}\cdot(n-1)}{\frac{n\cdot(n-1)}{2}}=2\cdot n^{n-3}\)
然後只需再除以總方案數\(n^{n-2}\)就是概率,即\(\frac{2}{n}\)

考慮第二種,顯然對於所有的\((u,x)\)概率都相等……可以發現,如果\((u,v)\)存在生成樹中,一定不會選到\((u,x)\),否則就等概率地選中\((u,x)\)。那麼答案為\(\frac{1-\frac{2}{n}}{n-2}\)

第三種不容易看出什麼特征了,我們暴力一點求。假設把這條邊切斷,發現左右分成兩部分,我們可以枚舉其中\(x\)部分的大小,設為\(i\),則\(y\)部分為\(n-i\),其中有\(4\)個點已經確定了——\(x,y,u,v\),為了方便,我們固定\(u\)\(x\)這邊,而\(v\)\(y\)這邊,最後答案乘\(2\)即可(交換\(u,v\))。顯然,答案需要乘上\(C_{n-4}^{i-2}\)\(n-4\)是因為除去這四個點,\(i-2\)是除去\(x\)\(u\)。然後左右兩邊的任意一個無根樹形態都是可以的,根據\(prufer\)編碼,答案就是: \[\sum_{i=2}^{n-2}{\cfrac{2\cdot i^{i-2}\cdot(n-i)^{n-i-2}\cdot C^{n-4}_{i-2}}{n^{n-2}}}\]直接\(O(n\log n)\)求就好了

然後統計答案,註意各種小細節,這道題就\(A\)掉辣!

\(Code:\)

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
#define N 1005
#define mod 998244353
int n, dis[N][N], nei[N], all;
int fir, sec, thi;
int fac[N], inv[N];
int ksm(int a, int k)
{
    if (!k)
        return 1;
    int p = ksm(a, k / 2);
    if (k & 1)
        return 1ll * a * p % mod * p % mod;
    return 1ll * p * p % mod;
}
int div(int a){return ksm(a, mod - 2);}
int tree(int a)
{
    if (a == 1)
        return 1;
    return ksm(a,  a - 2);
}
int C(int n, int m)
{
    return 1ll * fac[n] * inv[m] % mod * inv[n - m] % mod;
}
int main()
{
    fac[0] = 1;
    for (int i = 1; i <= N - 5; i++)
        fac[i] = 1ll * fac[i - 1] * i % mod;
    inv[N - 5] = ksm(fac[N - 5], mod - 2);
    for (int i = N - 5; i >= 1; i--)
        inv[i - 1] = 1ll * inv[i] * i % mod;
    scanf("%d", &n);
    for (int i = 1; i <= n; i++)
        for (int j = 1; j <= n; j++)
        {
            scanf("%d", &dis[i][j]);
            if (i < j)
                all = (all + dis[i][j]) % mod;
            nei[i] = (nei[i] + dis[i][j]) % mod;
        }
    fir = 2 * div(n) % mod;
    sec = 1ll * (1 - fir) * div(n - 2) % mod;
    if (sec < 0)
        sec += mod;
    for (int i = 1; i < n - 2; i++)
    {
        int j = n - 2 - i;
        thi = (thi + 2ll * tree(i + 1) * tree(j + 1) % mod * C(n - 4, i - 1) % mod) % mod;
    }
    thi = 1ll * thi * div(tree(n)) % mod;
    for (int i = 1; i <= n; i++)
        for (int j = 1; j <= n; j++)
        {
            int ans = 1ll * dis[i][j] * fir % mod;
            ans = (ans + 1ll * ((nei[i] + nei[j]) % mod - dis[i][j] * 2) % mod * sec % mod) % mod;
            ans = (ans + 1ll * (all - ((nei[i] + nei[j]) % mod - dis[i][j]) % mod) * thi % mod) % mod;
            if (ans < 0)
                ans += mod;
            if (i == j)
                ans = 0;
            printf("%d%c", ans, j == n ? 10 : 32);
        }
}

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 1. Java既是編譯型語言,又是解釋型語言 java源文件首先需要通過javac編譯生成尾碼名為.class的位元組碼文件(與平臺無關,只面向JVM),然後使用Java虛擬機將位元組碼解釋成特定平臺上的機器碼運行。 2. Java虛擬機JVM 不同平臺上的JVM不同,但是都提供了相同的介面。 3. 開 ...
  • [比賽鏈接](http://codeforces.com/contest/952) 感覺可能比洛谷的題目正常一點 就當學英語了吧 A Quirky Quantifiers比較正常,不是什麼很坑的題目。 判斷奇偶性即可 Code: B A Map of the Cat 給你兩種貓的被膜的感受,判斷是哪 ...
  • 1)File類操作文件的屬性 1.File類的常用方法 1. 文件的絕對完整路徑:getAbsolutePath() 文件名:getName() 文件相對路徑:getPath() 文件的上一級目錄:getParent() 文件的大小為:length() 刪除文件:delete() 具體操作請參考如下 ...
  • 持久化就是將記憶體中的數據保存起來,使之可以長期存在。 在Java中 可以做到持久化有很多種方法。 其中有: 1. 堵塞型IO,也就是我們經常說的io流; 2. 非堵塞型IO,通常稱為New IO。也就是我們經常說的nio 3. Xml 4. 序列化 5. 資料庫持久化 本人將在之後博客中開展關於Ja ...
  • 一、概述 很多程式都有記錄日誌的需求,並且日誌中包含的信息即有正常的程式訪問日誌,還可能有錯誤、警告等信息輸出,python的logging模塊提供了標準的日誌介面,你可以通過它存儲各種格式的日誌,logging的日誌可以分為 debug(), info(), warning(), error()  ...
  • Python的數據類型在前幾節我們都簡單的一一介紹了,接下來我們就要講到Python的控制判斷迴圈語句 在現實編程中,我們往往要利用電腦幫我們做大量重覆計算的工作,在這樣的情況下,需要機器能對某個條件進行判斷,或是對某個行為進行重覆操作 這時我們就必須要知道如何去編寫迴圈判斷語句 if... el ...
  • 1.安裝anaconda 下載地址:[清華鏡像站][url1] 針對自己的操作系統,在 下載鏈接 應用軟體 conda 中選擇合適版本。安裝過程較為簡單,這裡就不在詳細介紹。 需要註意 的是windows系統安裝過程中需要註意,勾選將軟體添加至windows路徑(也可以手動添加,即在環境變數 pat ...
  • 在項目中,遇到需求,需要進行規則入庫,想到使用正則進行表達式的拆分和分類,具體如下: 目標是:拆分介於表示邏輯運算的“And”或者“Or”的子句,比如:Operation Mode(Operation Mode_2) (Approve CR1) equals Accept;Need Physical ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...