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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

P1446-[HNOI2008]Cards【Burnside引理,dp】

發布時間:2023/12/3 编程问答 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 P1446-[HNOI2008]Cards【Burnside引理,dp】 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

正題

題目鏈接:https://www.luogu.com.cn/problem/P1446


題目大意

三個顏色的一些東西排在一起,給mmm種置換,求本質不同的染色方案數。


解題思路

BurnsideBurnsideBurnside引理:置換集合GGG時本質不同的序列方案等于∑x∈Gc(x)∣G∣\frac{\sum_{x\in G}c(x)}{|G|}GxG?c(x)?c(x)c(x)c(x)表示置換xxx中的不動點個數。

也就是每個循環中的顏色都相同,可以把每個循環視為一個物品,然后放入容量為r,g,br,g,br,g,b的背包里的方案數,求解即可。

時間復雜度O(r?g?b?m)O(r*g*b*m)O(r?g?b?m)


codecodecode

#include<cstdio> #include<cstring> #include<algorithm> #define ll long long using namespace std; ll r,b,g,m,p,n,tot,ans; ll siz[81],f[21][21][21],y[81]; bool v[81]; ll power(ll x,ll b){ll ans=1;while(b){if(b&1)ans=ans*x%p;x=x*x%p;b>>=1;}return ans; } ll solve(){memset(f,0,sizeof(f));memset(v,0,sizeof(v));tot=0;for(ll i=1;i<=n;i++){if(v[i])continue;siz[++tot]=0;ll x=i;while(!v[x]){siz[tot]++;v[x]=1;x=y[x];}}f[0][0][0]=1;for(ll x=1;x<=tot;x++)for(ll i=r;i>=0;i--)for(ll j=g;j>=0;j--)for(ll k=b;k>=0;k--){if(i>=siz[x])(f[i][j][k]+=f[i-siz[x]][j][k])%=p;if(j>=siz[x])(f[i][j][k]+=f[i][j-siz[x]][k])%=p;if(k>=siz[x])(f[i][j][k]+=f[i][j][k-siz[x]])%=p;}return f[r][g][b]; } int main() {scanf("%lld%lld%lld%lld%lld",&r,&g,&b,&m,&p);n=r+b+g;for(ll i=1;i<=n;i++)y[i]=i;ans=solve();for(ll i=1;i<=m;i++){for(ll j=1;j<=n;j++)scanf("%lld",&y[j]);(ans+=solve())%=p;}printf("%lld\n",ans*power(m+1,p-2)%p);return 0; }

總結

以上是生活随笔為你收集整理的P1446-[HNOI2008]Cards【Burnside引理,dp】的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。