今天我們來看看CF294C
題目連結linux
題目
給你\(n\)個燈泡,其中\(m\)個已經點亮。每次你能夠點亮一個旁邊有亮燈泡的燈泡,求有多少方法能夠點亮全部燈泡。ios
這題的想法真的很酷炫
c++
把每個連續沒亮燈泡的區域當成一種元素(也就是說:暗暗暗亮暗暗暗亮暗暗暗,這種情況就當作\(AAABBBCCC\)),如此一來重複排列的可能性是\(\frac{9!}{3!3!3!}\),而只要區段不是接壤頭或接壤尾,其中長度為\(k\)的沒亮燈泡區段其中有\(k-1\)次都有兩種選擇,所以答案只要再乘上\(2\)的若干次方便可。spa
const int _n=1010; int t,n,m,a[_n],fac[_n],inv[_n],c; VI cnt; main(void) {ios_base::sync_with_stdio(0);cin.tie(0);cout.tie(0); cin>>n>>m;rep(i,0,m){cin>>t;a[t]=1;} a[n+1]=1;rep(i,1,n+2){ if(a[i]==1 and c)cnt.pb(c),c=0; if(a[i]==0)c++; }c=0;if(a[1]==0)c+=cnt[0]-1;if(a[n]==0)c+=cnt.back()-1; fac[0]=1;rep(i,1,n+1)fac[i]=1ll*fac[i-1]*i%mod; inv[n]=powmod(fac[n],mod-2);per(i,0,n)inv[i]=1ll*inv[i+1]*(i+1)%mod; ll ans=fac[n-m];rep(i,0,SZ(cnt))ans=ans*inv[cnt[i]]%mod; ans=ans*powmod(2,n-m-SZ(cnt)-c)%mod;cout<<ans<<'\n'; return 0; }
標頭、模板請點Submission看
Submissioncode