hdu - 6836
對於一張圖,每個生成樹的權值為所有邊按位與的結果,求生成樹期望權值。
樸素解法:暴力求出每乙個生成樹,累積權值和,然後除生成樹總數。
int型別只有31位,既然是與的結果,對於每一條生成樹所有的邊該位都應該是1,
按位列舉每一位,求出該位為1的生成樹權值大小,將結果累積到答案裡。
#includeusingview codenamespace
std;
typedef
long
long
ll;const
int n=1e4+500
;const ll mod=998244353
;int a[40][120][120
];ll determinant(
int b[120][120],int
n) res=-res;
break
; }
}if(!flag)
return0;
}for(int j=i+1;j<=n;j ++)
res=-res;}}
res= ((res*b[i][i])%mod+mod)%mod;
}return res%mod;
}ll qpow(ll a, ll b,ll m)
base *= base
;
base %=m;
b >>= 1; //
注意是b>>=1 not b>>1
}
return
ans;
}ll inv(ll x)
intmain()}a[
31][u][u]++;
a[31][v][v]++;
a[31][u][v]--;
a[31][v][u]--;
}ll ans=0
; ll cnt=determinant(a[31],n-1
);
for(int i=0;i<=30;i++)
ans=ans*inv(cnt)%mod;
printf(
"%lld\n
",ans);
}//system("pause");
return0;
}
hdu - 6832
一張圖,每條邊權值為2的 i 次方,求
因為每條邊的權值為2的 i 的 次方,那麼每兩點的最短路即為生成樹上的距離,那麼直接列舉每一條邊,計算它被算多少次即可。
#includeusingview codenamespace
std;
typedef
long
long
ll;const
int n=1e5+50
;const ll mod=1e9+7
;int
a[n], fa[n],head[n];
inttot0,tot1,ecnt,n,m;
ll ans;
struct
edgee[
2*n];
void add(int u,int v,int
w)int
cnt0[n],size[n];
void
init()
int find(int x)
//構建:
void build(int x,int y)
ll qpow(ll a, ll b,ll m)
base *= base
;
base %=m;
b >>= 1; //
注意是b>>=1 not b>>1
}
return
ans;
}void dfs_size(int u,int
fa)}
void dfs_ans(int u,int
fa)}
intmain()
for(int i=1;i<=m;i++)
dfs_size(
1,-1
); dfs_ans(
1,-1
); printf(
"%lld\n
",ans);
}//system("pause");
return0;
}
Tetrahedron(2020杭電多校)
題意 給你直角四面體的三邊a,b,c,三者兩兩垂直,問a,b,c從 1,n 隨機挑選,求三者交點到底面的距離的平方的逆元。直角四面體有條結論是1 h2 1 a2 1 b2 1 c2 然而比賽的時候沒想到怎麼算期望,捂臉。演算法 e 1 h2 e 1 a2 e 1 b2 e 1 c2 3 e 1 a2...
2020杭電多校七(Game)
hdu6850 題解 從外層依次刪去最遠的點對,最後刪到只剩餘乙個點的時候判斷該點是否第乙個點,是的話就必敗,否則就必勝,因為如果先手一開始處於最遠點對上的點的時候,那麼每次先手均可在本層走走遠點對距離,那麼後手要想走就必須走更遠的距離,那麼後手就只能向上一層走,但是當後手向上走的時候他一定會位於最...
Fibonacci Sum 2020杭電多校1
一開始想的是用矩陣來求,但發現樣例一直過不去。最後才發現,ab k ne a kb k 其中 a,b 為矩陣,做了怎麼久才發現是乙個假演算法。看來題解才發現用的是斐波那契數列的通項公式 f n frac frac n frac n 同時還要知道 5 是 1e9 9 的二次剩餘 且有 38300801...