好久好久好久好久沒寫部落格了,因為csdn改版了,一直不大喜歡,所以也就不大樂意上部落格了。
。事實上說起來也沒什麼題好寫的,有時候還是會做到好題的。因為已經忘記了csdn忘記了我有部落格,於是就沒寫了。
but 如今還是繼續開始吧,有什麼感覺不錯的題還是能夠mark下的。
接下來是題意,中文題就是好,直接上題目。
思路:題目就是求最小生成樹的種數。中心的點必需要和周圍的一圈點連通。能夠先不要管環,先考慮鏈的情況
dp[ i ][ 0 ]表示第i個點還沒和中心點連通,而且前i-1個點和中心點或者第i個點是連通的
dp[ i ][ 1 ]表示前i個點所有都已經和中心點連通了
非常easy能夠推出狀態轉移方程 :
dp[ i ][ 0 ] = dp[ i-1 ][ 0 ] + dp[ i-1 ][ 1 ]
dp[ i ][ 1 ] = dp[ i-1 ][ 0 ] + dp[ i-1 ][ 1 ]*2
那麼對於n輪狀病毒。能夠列舉第乙個點和多少個周圍的點連通,其餘的點就是一條鏈的情況了。
ps: 高精度是必須的
code:
#include
#include
#include
#include
#include
using namespace std;
const int numlen = 205;
struct bign
bign(int num)
bign(const char *num)
bign operator = (const int num)
bign operator = (const char *num)
void deal()
bign operator + (const bign &a)const
return ret;
}bign operator *(const int num) const
while(bb)
ret.deal();
return ret;
}string str() const
};istream& operator >> (istream &in, bign &x)
ostream& operator << (ostream &out, const bign &x)
const int n = 100+5;
bign dp[n][2], ans[n];
void init(int n)
for(int i = 1;i <= n; i++)
}} int main()
bign(int num)
bign(const char *num)
bign operator = (const int num)
bign operator = (const char *num)
void deal()
bign operator + (const bign &a)const
return ret;
}bign operator *(const int num) const
while(bb)
ret.deal();
return ret;
}string str() const
};istream& operator >> (istream &in, bign &x)
ostream& operator << (ostream &out, const bign &x)
const int n = 100+5;
bign dp[n][2], ans[n];
void init(int n)
for(int i = 1;i <= n; i++)
}} int main(){
int n;
scanf("%d", &n);
init(n);
cout<
FJOI2007 bzoj1002 輪狀病毒
description 輪狀病毒有很多變種,所有輪狀病毒的變種都是從乙個輪狀基產生的。乙個n輪狀基由圓環上n個不同的基原子 和圓心處乙個核原子構成的,2個原子之間的邊表示這2個原子之間的資訊通道。如下圖所示 n輪狀病毒的產生規律是在乙個n輪狀基中刪去若干條邊,使得各原子之間有唯一的資訊通道,例如共有...
BZOJ 1002 FJOI2007 輪狀病毒
1002 fjoi2007 輪狀病毒 time limit 1 sec memory limit 162 mb description 輪狀病毒有很多變種,所有輪狀病毒的變種都是從乙個輪狀基產生的。乙個n輪狀基由圓環上n個不同的基原子 和圓心處乙個核原子構成的,2個原子之間的邊表示這2個原子之間的資...
BZOJ1002 FJOI2007 輪狀病毒
標籤 高精度,數學 description 輪狀病毒有很多變種,所有輪狀病毒的變種都是從乙個輪狀基產生的。乙個n輪狀基由圓環上n個不同的基原子 和圓心處乙個核原子構成的,2個原子之間的邊表示這2個原子之間的資訊通道。如下圖所示 n輪狀病毒的產生規律是在乙個n輪狀基中刪去若干條邊,使得各原子之間有唯一...