題目大意:給你一顆$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自動機其實對解題沒有影響,因為最後統計的實際...