2019北京集訓測試賽(十三) 函樹 虛樹

2022-05-03 18:57:10 字數 2330 閱讀 7268

題目大意:給你一顆$n$個節點的樹,定義$d(x,y)=$點$x$到點$y$最短路上經過的邊數。

求$\sum\limits_^ \sum\limits_^ \varphi(i\times j)\times d(i,j)$

答案對998244353$取模。

我們對這個式子做一些細微的處理,設最終的答案為$ans$:

$ans=\sum\limits_^ \sum\limits_^ \varphi(i\times j)\times d(i,j)$

$=\sum\limits_^ \sum\limits_^ \varphi(i)\varphi(j)\frac\times d(i,j)$

我們設$f(d)=\sum\limits_^ \sum\limits_^ \varphi(i)\varphi(j)\times d(i,j)$

那麼,$ans=\sum\limits_^ \frac \sum\limits_ f(p)\times g(\frac)$

對於$g(x)$,設$x=\prod\limits_^ p_i$,$p_i$是質數,$g(x)=(-1)^k$

我們考慮如何求$f(d)$。

顯然,我們只需要把所有點權能被$d$整除的點找出來,建一棵虛樹,統計每條虛樹邊兩端的\$sum \varphi(i)$,把它們乘起來,再乘上虛樹邊邊長即可。

由於點權等於編號,所以n棵虛樹的總點數是$o(n\ln\ n)$級別的,單次構建虛樹的複雜度是$o(size\log\ size)$的,所以並不會$t$掉。

然後就沒有了,總複雜度是$o(n\log^2\ n)$的。

1 #include2

#define m 100005

3#define mod 998244353

4#define l long long

5using

namespace

std;67

int pri[m]=,b[m]=,phi[m]=,zf[m]=,use=0;8

void

init()

15 phi[i*pri[j]]=phi[i]*(pri[j]-1

);16}17

}18}19

20 l pow_mod(l x,l k)

21 vectorg[m];

2223

struct edgee[m*2]=; int head[m]=,use=0;24

void add(int x,int y,int z)

25int n,a[m]=;

2627

int dep[m]=,dfn[m]=,low[m]=,f[m][20]=,t=0;28

void dfs(int x,int

fa)34

int getlca(int x,int

y)41

42 vector d[m]; l f[m]=;

4344

bool cmp(int x,int y)

45int point[m]=,stk[m]=,is[m]=,pcnt=0,cnt=0,nowt=0;46

void

build()59}

60 stk[++siz]=point[i]; is[point[i]]=1;61

}62 sort(point+1,point+pcnt+1

,cmp);

63while(siz) stk[siz--]=0;64

}65 l sumphi[m]=,sum=0;66

int dfs(int

x)73}74

void getans(int

x,l fsum)80}

81void solve(int

x)86

build();

87 nowt=1; dfs(point[1

]);88 nowt=1; getans(point[1],0

);89 f[x]=sum;90}

9192

intmain()

103}

104for(int i=1;i)

108 dfs(1,0

);109

for(int i=1;i<=n;i++) solve(i);

110for(int i=n;i;i--)

114 l ans=0

;115

for(int d=1;d<=n;d++)

116 ans=(ans+f[d]*d%mod*pow_mod(phi[d],mod-2))%mod;

117 cout<2%mod<118//

cout<119 }

2016北京集訓測試賽1 奇怪的樹 樹鏈剖分

對於操作1,不論選了哪個點為a,最後反轉顏色的點集都只有兩種型別 顯然啦 暴力解法 對每個操作3,從a向上直到根節點,每到乙個節點記錄 它父親的黑點數減去自己的黑點數 父親節點的編號。另外,還要記錄a子樹內的黑點。這種o n2 的做法肯定會爆,考慮優化。由於這是一棵靜態樹,考慮樹鏈剖分。需要記錄乙個...

2019北京集訓3 邏輯 樹剖 2 sat

題目大意 有一顆有 m 個葉子節點的二叉樹。對於葉子節點 i x i a i xor v or b i xor v 對於非葉子節點 i x i x sonl and x sonr 上文的 or 和 xor 均為邏輯運算子。且v為乙個長度為 n 的布林陣列,需要你自己構造。下面問 對於每個非葉子節點 ...

noip2019集訓測試賽(一)B 字串

upd 本題字符集為全體小寫字母 這題我寫了乙個查詢前暴力get fail的,複雜度 但資料水,過了 時間複雜度 o mlogm 前序遍歷fail樹,得到dfn,就可以愉快地維護樹狀陣列查詢答案了 關於fail樹可以看看這裡 tips 把查詢的s也插入ac自動機其實對解題沒有影響,因為最後統計的實際...