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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

bzoj 3195 奇怪的道路

發布時間:2025/3/16 编程问答 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 bzoj 3195 奇怪的道路 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

Written with StackEdit.

Description

小宇從歷史書上了解到一個古老的文明。這個文明在各個方面高度發達,交通方面也不例外。考古學家已經知道,這個文明在全盛時期有\(n\)座城市,編號為\(1..n\)\(m\)條道路連接在這些城市之間,每條道路將兩個城市連接起來,使得兩地的居民可以方便地來往。一對城市之間可能存在多條道路。
據史料記載,這個文明的交通網絡滿足兩個奇怪的特征。首先,這個文明崇拜數字\(K\),所以對于任何一條道路,設它連接的兩個城市分別為\(u\)\(v\),則必定滿足\(1 <=|u - v| <= K.\)此外,任何一個城市都與恰好偶數條道路相連(\(0\)也被認為是偶數)。不過,由于時間過于久遠,具體的交通網絡我們已經無法得知了。小宇很好奇這\(n\)個城市之間究竟有多少種可能的連接方法,于是她向你求助。
方法數可能很大,你只需要輸出方法數模\(10^9+7\)后的結果。

Input

輸入共一行,為\(3\)個整數\(n,m,K\)

Output

輸出\(1\)個整數,表示方案數模\(10^9+7\)后的結果。

Sample Input

【輸入樣例1】
3 4 1
【輸入樣例2】
4 3 3

Sample Output

【輸出樣例1】
3

【輸出樣例2】
4

HINT

\(100\%\)的數據滿足\(1 <= n <= 30, 0 <= m <= 30, 1 <= K <= 8.\)

兩種可能的連接方法不同當且僅當存在一對城市,它們間的道路數在兩種方法中不同。
在交通網絡中,有可能存在兩個城市無法互相到達。

Solution

  • \(K\)的范圍較小,考慮設計狀態數目與\(K\)有關的狀壓\(dp\).
  • \(f[i][j][S][l]\)表示考慮到第\(i\)個點,使用了\(j\)條邊.
  • \(S\)只用壓縮\(i-k\)~\(i\)的度數奇偶性,因為前面的點是無法再被連邊的.
  • \(l\)表示當前處理\(i\)\(i-l\)連邊.
  • 那么枚舉\(i,j,S,l\),按照狀態定義連邊或不連邊轉移.
#include<bits/stdc++.h> using namespace std; typedef long long LoveLive; inline int read() {int out=0,fh=1;char jp=getchar();while ((jp>'9'||jp<'0')&&jp!='-')jp=getchar();if (jp=='-'){fh=-1;jp=getchar();}while (jp>='0'&&jp<='9'){out=out*10+jp-'0';jp=getchar();}return out*fh; } const int P=1e9+7; inline int add(int a,int b) {return (a+b) % P; } inline int mul(int a,int b) {return 1LL * a * b % P; } const int MAXN=32,MAXK=10; int n,m,k; int f[MAXN][MAXN][1<<MAXK][MAXK]; int main() {n=read(),m=read(),k=read();f[1][0][0][1]=1;for(int i=1;i<=n;++i){for(int j=0;j<=m;++j){for(int s=0;s<(1<<(k+1));++s){for(int l=1;l<=k;++l)//從i向i-l連邊.避免重復計數 {int res=f[i][j][s][l];f[i][j][s][l+1]=add(f[i][j][s][l+1],res);//不連邊直接轉移 if(l<=i-1){int news=s^(1<<k)^(1<<(k-l));f[i][j+1][news][l]=add(f[i][j+1][news][l],res);}}if((s&1)==0)//度數為偶,符合條件,不再考慮 f[i+1][j][s>>1][1]=add(f[i+1][j][s>>1][1],f[i][j][s][k]);}}}printf("%d\n",f[n][m][0][k]);return 0; }

轉載于:https://www.cnblogs.com/jklover/p/10062171.html

總結

以上是生活随笔為你收集整理的bzoj 3195 奇怪的道路的全部內容,希望文章能夠幫你解決所遇到的問題。

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