日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) >

Codeforces 724 G Xor-matic Number of the Graph 线性基+DFS

發(fā)布時(shí)間:2025/7/14 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Codeforces 724 G Xor-matic Number of the Graph 线性基+DFS 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

G. Xor-matic Number of the Graph

http://codeforces.com/problemset/problem/724/G

題意:給你一張無(wú)向圖。定義一個(gè)無(wú)序三元組(u,v,s)表示u到v的(不一定為簡(jiǎn)單路徑)路徑上xor值為s。求出這張無(wú)向圖所有不重復(fù)三元組的s之和。1≤n≤10^5,1≤m≤2*10^5。

想法:

如果做過(guò)【W(wǎng)c2011 xor】這道題目(題解),那么問題變得簡(jiǎn)單起來(lái)了。

①假設(shè)我們欽定一個(gè)(u,v),設(shè)任意一條u->v的路徑xor值為X,該連通圖所有小環(huán)xor值構(gòu)成的序列為{Ai}。

那么(u,v)的所有路徑的xor值可以由X xor {Ai}的子集xor值得到。于是一個(gè)(u,v)的 s 之和變成了求X xor{Ai}的子集可以得到多少個(gè)不同的數(shù),這些不同的數(shù)的和是多少?

如果能知道{Ai}的子集xor值的值域,那么好辦了。于是用線性基得到值域{T}。求和的話,按位考慮定義S(i)為{T}中第i為1的個(gè)數(shù),為0的個(gè)數(shù)取個(gè)補(bǔ)集就好了。

對(duì)于一個(gè)(u,v):

②考慮所有的無(wú)序點(diǎn)對(duì)(u,v)的答案。上面說(shuō)過(guò)任意一條u->v的路徑都可以,不如就欽定是DFS遍歷得到DFS樹的樹上路徑。

樹上兩點(diǎn)路徑xor值的求法很簡(jiǎn)單:設(shè)dis(i)表示第i個(gè)到根節(jié)點(diǎn)路徑xor值。

dis(a,b)=dis(a) xor dis(lca(a,b)) xor dis(b) xor dis(lca(a,b))=dia(a) xor dis(b)。

根據(jù)上面求ans 的式子,ans只與X的第j位是什么有關(guān),所以設(shè)cnt(i)表示兩點(diǎn)路徑xor值第i位為1的個(gè)數(shù)。cnt(i)可以利用上面dis(a,b)=dia(a) xor dis(b)求。

對(duì)于所有(u,v):

于是解決了。

#include<cstdio> #include<vector> #define ll long long const int len(100000),MP(1000000007); struct Node{int nd;ll co;}; std::vector<Node>Edge[len+10]; int n,m,u,v,top,ans,much,vis[len+10]; ll sum,S[61],cnt[61],now[61];//cnt(i) 統(tǒng)計(jì) i-th =0的個(gè)數(shù) now(i):dx^dy i-th==1的個(gè)數(shù) ll st[len+10],dis[len+10],All,t; struct Base_Linear {ll p[61];int size;void ins(ll x){for(int j=60;j>=0;j--)if((x>>j)&1){if(p[j])x^=p[j];else {p[j]=x;size++;break;}}} }BL; template <class T>void read(T &x) {x=0;int f=0;char ch=getchar();while(ch<'0'||ch>'9'){f=(ch=='-');ch=getchar();}while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}x=f?-x:x; } ll power(int a,int b) {ll t=1,y=a;for(;b;b>>=1){if(b&1)t=(t*y)%MP;y=(y*y)%MP;}return t; } void add(int a,int b,ll c){Edge[a].push_back((Node){b,c});} void plus(ll x) {for(int j=0;j<=60;j++)if(((x>>j)&1)==0)cnt[j]++; } void Dfs(int x) {much++; vis[x]=1; plus(dis[x]); st[++top]=dis[x];for(int v=0,sz=Edge[x].size();v<sz;v++){Node y=Edge[x][v];if(vis[y.nd])BL.ins(dis[x]^dis[y.nd]^y.co);else {dis[y.nd]=dis[x]^y.co;Dfs(y.nd);}} } void Back() {for(int j=0;j<=60;j++)cnt[j]=now[j]=S[j]=0;for(int j=0;j<=60;j++)BL.p[j]=0; BL.size=0;much=0; All=0; } void Total() {for(;top;top--){for(int j=0;st[top];j++,st[top]>>=1)if(st[top]&1)now[j]=(now[j]+cnt[j])%MP;}for(int j=0;j<=60;j++)All|=BL.p[j];for(int j=0;All;j++,All>>=1)if(All&1)S[j]=power(2,BL.size-1);All=power(2,BL.size); ll C=1;for(int j=0;j<=60;j++,C<<=1,C%=MP){sum=(ll)much*(much-1)/2;ll t1=now[j]*(All-S[j])%MP;ll t2=((sum-now[j])*S[j])%MP;ans=(ans+C*t1+C*t2)%MP;} } int main() {read(n),read(m);for(int i=1;i<=m;i++){read(u),read(v),read(t);add(u,v,t),add(v,u,t);}for(int i=1;i<=n;i++)if(!vis[i])//圖可能不連通 {Back();Dfs(i);Total();}ans+=ans<0?MP:0;printf("%d",ans);return 0; } View Code

?

轉(zhuǎn)載于:https://www.cnblogs.com/Oncle-Ha/p/6679576.html

總結(jié)

以上是生活随笔為你收集整理的Codeforces 724 G Xor-matic Number of the Graph 线性基+DFS的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。