最小生成樹

2022-05-11 03:30:24 字數 1239 閱讀 8823

話說正在 jmy 愁苦如何籌錢給大家買汽水的時候,他遇上了一位魔法師。魔法師希望 jmy能幫他破解魔法書的咒語。如果 jmy 做到了,就幫他付所有買汽水的錢。

魔法書上畫了乙個完全圖(每兩個點之間有且只有一條邊),每個點都有乙個獨一無二的[1,n]內的編號,jmy 的任務是要找到最小生成樹,以此作為魔法樹,從而破解咒語。

對於完全圖的邊(i,j) (i≠j)的邊權恰好就等於 i,j 兩個數字的最大公約數。

特別地,要作為魔法樹,必須滿足樹指定某個點為根後,所有除根以外的節點的父親的標號必須小於自身標號。

jmy 一眼就看出了最小生成樹的邊權和。然而咒語卻是最小生成樹的個數。 為了保證大家都有汽水喝,你能幫幫 jmy 嗎?

一行僅乙個數 n,表示完全圖的大小。

一行乙個整數,表示答案對 100,000,007 取模(mod)的結果。

【資料規模】

對於 10%的資料,n≤5;

對於 30%的資料,n≤8;

對於 40%的資料,n≤10;

對於 70%的資料,n≤5,000;

對於 100%的資料,n≤20,000。

數學,尤拉函式

首先必須要得出是最小生成樹的權值和一定是n-1,(每個點都與1連),所以相連的必須是互質的,這就是尤拉函式,每個點與小於自己的與自己互質的數連起來,(特別的φ(1)=1),所以相當於是乘法原理,得到尤拉函式後相乘到n就是ans.

1 #include2 #include3 #include4 #include5 #include6 #include7 #include8 #include9 #include10 #include11 #include12 #include

13#define rep(i,a,b) for(register int i=a;i<=b;i++)

14#define il inline

15#define ll long long

16using

namespace

std;

17const

int n=20010;18

ll prime[n],phi[n];

19bool

is[n];

20int

n;21

void

eular() 32}

33}34ll gl();

35 ll mod=100000007;36

intmain()

46ll gl()

最小生成樹 次小生成樹

一 最小生成樹 說到生成樹首先要解釋一下樹,樹是乙個聯通的無向無環圖,多棵樹的集合則被稱為森林。因此,樹具有許多性質 1.兩點之間的路徑是唯一的。2.邊數等於點數減一。3.連線任意兩點都會生成乙個環。對於乙個無向聯通圖g的子圖,如果它包含g的所有點,則它被稱為g的生成樹,而各邊權和最小的生成樹則被稱...

最小生成樹

package 圖 最小生成樹是用最少的邊吧把所有的節點連線起來。於是和圖的深度優先搜素差不多。class stack public void push int key public int pop 檢視棧頂的元素 public int peek public boolean isempty cla...

最小生成樹

define max vertex num 20 最大頂點數 typedef int adjmatrix max vertex num max vertex num 鄰接矩陣型別 typedef char vertextype typedef struct mgraph struct dnodecl...