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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

【LOJ6072】苹果树【折半搜索】【矩阵树定理】【二项式反演】

發(fā)布時間:2023/12/3 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【LOJ6072】苹果树【折半搜索】【矩阵树定理】【二项式反演】 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

題意:有好壞兩種點(diǎn)共 nnn 個,每個好點(diǎn)有權(quán)值,把這 nnn 個點(diǎn)連成一棵樹,一個好點(diǎn)為有用的當(dāng)且僅當(dāng)它至少與一個好點(diǎn)相鄰,求所有有用的點(diǎn)的權(quán)值和不超過 limlimlim 的方案數(shù)。

n≤40n\leq 40n40

這題網(wǎng)上的容斥方法基本都是假的……

發(fā)現(xiàn)至少與一個好點(diǎn)相鄰不好處理,但只能與壞點(diǎn)相鄰比較方便,所以大概是個容斥。

設(shè)有 mmm 個好點(diǎn), f(k)f(k)f(k) 表示欽定 kkk 個點(diǎn),有用的點(diǎn)只能在這 kkk 個當(dāng)中選,相當(dāng)于欽定其他 m?km-km?k 個是沒用的。(以下簡稱“可以有用”。)g(k)g(k)g(k) 表示恰好有 kkk 個有用的點(diǎn)。

那么有

f(k)=∑i=0k(ki)g(i)f(k)=\sum_{i=0}^k\binom{k}{i}g(i)f(k)=i=0k?(ik?)g(i)

欽定 kkk 個可以有用的點(diǎn)后,把所有好點(diǎn)和壞點(diǎn)連邊,有用的點(diǎn)和壞點(diǎn)內(nèi)部連邊,就可以算出 fff

然后你會發(fā)現(xiàn)你假了。

第一,你算矩陣樹只能欽定固定的 kkk 個可以有用,而 fff 的定義是任意欽定,欽定這個動作本身的方案是算在其中的。

第二,因?yàn)檫@ kkk 個是不固定的,你算出了 ggg 也沒法算答案……

所以必須要改下定義。

定義 f(k)f(k)f(k)已經(jīng)確定了 kkk 個點(diǎn)可以有用的連邊方案。也就是具體是哪 kkk 個點(diǎn)已經(jīng)幫你欽定好了,你只需要管連邊的方案。

g(k)g(k)g(k)已經(jīng)確定恰好有 kkk 個點(diǎn)有用的連邊方案,具體含義同上。

先不管權(quán)值的事情,對于一個欽定可以有用的方案,建出圖后考慮它的一棵生成樹,把欽定的 kkk 個點(diǎn)中全部連的壞點(diǎn)的拿出來,假設(shè)有 iii 個,就對應(yīng)了一種 g(i)g(i)g(i) 的方案。

所以式子是一樣的

f(k)=∑i=0k(ki)g(i)f(k)=\sum_{i=0}^k\binom{k}{i}g(i)f(k)=i=0k?(ik?)g(i)

二項(xiàng)式反演

g(k)=∑i=0k(?1)k?i(ki)f(i)g(k)=\sum_{i=0}^k(-1)^{k-i}\binom{k}{i}f(i)g(k)=i=0k?(?1)k?i(ik?)f(i)

fff 因?yàn)槭蔷仃嚇渌愕?#xff0c;已經(jīng)欽定好了。對于所有 g(k)g(k)g(k),乘上欽定本身的方案的和就是答案。欽定本身可以折半搜索+two pointer算出。

復(fù)雜度 O(2n/2+n4)O(2^{n/2}+n^4)O(2n/2+n4)

順帶一提,如果是欽定沒用的點(diǎn),式子是長這樣的

f(k)=∑i=km(m?ki?k)g(i)f(k)=\sum_{i=k}^m\binom{m-k}{i-k}g(i)f(k)=i=km?(i?km?k?)g(i)

而不是

f(k)=∑i=km(ik)g(i)f(k)=\sum_{i=k}^m\binom{i}{k}g(i)f(k)=i=km?(ki?)g(i)

原因同上

#include <iostream> #include <cstdio> #include <cstring> #include <cctype> #include <algorithm> #include <vector> using namespace std; typedef long long ll; const int MOD=1e9+7; inline int add(const int& x,const int& y){return x+y>=MOD? x+y-MOD:x+y;} inline int qpow(int a,int p) {int ans=1;while (p){if (p&1) ans=(ll)ans*a%MOD;a=(ll)a*a%MOD,p>>=1;}return ans; } int C[45][45],n,lim,a[45],cnt[45],f[45]; vector<int> L[45],R[45]; void dfs(vector<int>* v,int cur,int pos,int k,int sum) {if (sum>lim) return;if (cur>pos) return v[k].push_back(sum);dfs(v,cur+1,pos,k,sum);dfs(v,cur+1,pos,k+1,sum+a[cur]); } inline int calc(const vector<int>& a,const vector<int>& b) {int pos=b.size(),ans=0;for (int i=0;i<(int)a.size();i++){while (pos&&a[i]+b[pos-1]>lim) --pos;ans=(ans+pos)%MOD;}return ans; } int g[45][45]; inline int det(int n) {int ans=1;for (int i=1;i<n;i++) for (int j=1;j<n;j++) (g[i][j]<0)&&(g[i][j]+=MOD);for (int i=1;i<n;i++){int pos=i;for (;!g[pos][i]&&pos<n;++pos);if (pos==n) return 0;if (pos>i) swap(g[i],g[pos]),ans=MOD-ans;ans=(ll)ans*g[i][i]%MOD;for (int j=i+1;j<n;j++){int t=(ll)g[j][i]*qpow(g[i][i],MOD-2)%MOD;for (int k=i;k<n;k++) g[j][k]=(g[j][k]-(ll)t*g[i][k]%MOD+MOD)%MOD;}}return ans; } int main() {scanf("%d%d",&n,&lim);C[0][0]=1;for (int i=1;i<=n;i++){C[i][0]=1;for (int j=1;j<=i;j++) C[i][j]=add(C[i-1][j-1],C[i-1][j]);}for (int i=1;i<=n;i++) scanf("%d",&a[i]);sort(a+1,a+n+1);int bad=0;for (;a[bad+1]==-1;++bad);int mid=(bad+1+n)>>1;dfs(L,bad+1,mid,0,0),dfs(R,mid+1,n,0,0);int m=n-bad;for (int i=0;i<=m;i++) sort(L[i].begin(),L[i].end()),sort(R[i].begin(),R[i].end());for (int k=0;k<=m;k++){for (int i=0;i<=k;i++) cnt[k]=add(cnt[k],calc(L[i],R[k-i]));memset(g,0,sizeof(g));for (int i=1;i<=bad;i++)for (int j=1;j<i;j++){++g[i][i],++g[j][j];--g[i][j],--g[j][i];}for (int i=bad+1;i<=bad+k;i++)for (int j=1;j<i;j++){++g[i][i],++g[j][j];--g[i][j],--g[j][i];} for (int i=bad+k+1;i<=n;i++)for (int j=1;j<=bad;j++){++g[i][i],++g[j][j];--g[i][j],--g[j][i]; }f[k]=det(n);}int sum=0;for (int k=0;k<=m;k++){int ans=0;for (int i=0;i<=k;i++) ans=(ans+(((i-k)&1)? -1ll:1ll)*C[k][i]*f[i])%MOD; // cerr<<ans<<'\n';sum=(sum+(ll)cnt[k]*ans)%MOD;}printf("%d\n",(sum+MOD)%MOD);return 0; }

總結(jié)

以上是生活随笔為你收集整理的【LOJ6072】苹果树【折半搜索】【矩阵树定理】【二项式反演】的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

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

主站蜘蛛池模板: 麻豆tube | 男男受被啪到高潮自述 | 免费毛片在线 | 日韩爱爱网站 | 国产成人无码精品久久 | 午夜精品福利一区二区蜜股av | 日本涩涩网 | 中国老头性行为xxxx | www.xxxx欧美 | 国产曰肥老太婆无遮挡 | 欧美乱人伦 | 亚洲人屁股眼子交1 | 国产三级自拍 | 欧美日韩激情 | 欧美久久影院 | 999国产视频 | 国产三级在线播放 | www.亚洲天堂 | 成年人在线观看视频免费 | 搡老岳熟女国产熟妇 | 欧美精品成人在线 | 日韩美女视频在线观看 | 亚洲AV无码精品色毛片浪潮 | 成人av免费在线 | 欧美不卡视频在线观看 | 国产麻豆成人传媒免费观看 | 日本公妇乱偷中文字幕 | 人妖和人妖互交性xxxx视频 | 日韩免费看片 | 少妇网站在线观看 | 影音先锋久久 | xxxx 国产| 天天舔天天干 | 手机福利视频 | 国产剧情在线视频 | 日美av | 亚洲精品国产电影 | 成年人网站免费在线观看 | 欧美一区,二区 | 91精品国产色综合久久不卡98 | 五月婷婷激情综合网 | 日韩在线免费 | 欧美黄页 | 三上悠亚一区二区三区 | 图片区小说区视频区 | 日本色图片 | 黄色片免费在线播放 | 狠狠丁香 | 成了校长的性脔h文 | 91精品国产乱码久久久久久久久 | 精人妻一区二区三区 | 亚洲色图35p| 国产精品国产av | 国产黑丝在线播放 | 亚洲精品久久久久久一区二区 | 男女瑟瑟视频 | 日韩精品色哟哟 | 日本a在线 | 欧美波霸影院 | 少妇高潮视频 | 久久九九精品视频 | 老子午夜影院 | 欧美性aaa | 国产成人在线电影 | 欧美亚洲国产视频 | 黄色av电影网址 | 国产主播一区二区 | 极品美妇后花庭翘臀娇吟小说 | 日韩午夜激情视频 | www.自拍 | 国产一区视频在线免费观看 | 瑟瑟久久| 亚洲天堂av免费在线观看 | 可以免费看的av毛片 | 美国黄色一级视频 | jizz免费视频 | 日本一区二区三区免费观看 | 放荡的少妇2欧美版 | 国产美女极度色诱视频www | 免费看一级黄色大片 | wwwxxx日本| 韩国三级国产 | 精品一区二区视频在线观看 | 亚洲六月婷婷 | 精品国产aⅴ | 亚洲二区一区 | 日韩女优在线 | 大奶子情人 | 国产精品毛片一区视频播 | 国产sm调教视频 | 亚洲视频中文 | 粗大的内捧猛烈进出在线视频 | 欧美日韩在线免费观看 | 无遮挡aaaaa大片免费看 | 欧美四级在线观看 | 午夜宅男影院 | 天天射日日操 | 欧美 日韩 国产 在线观看 | 国产秋霞|