FJOI2007 輪狀病毒(矩陣樹定理)

2022-03-02 02:18:32 字數 1488 閱讀 9244

time limit: 1 sec  memory limit: 162 mb

[submit][status][discuss]

輪狀病毒有很多變種,所有輪狀病毒的變種都是從乙個輪狀基產生的。乙個n輪狀基由圓環上n個不同的基原子

和圓心處乙個核原子構成的,2個原子之間的邊表示這2個原子之間的資訊通道。如下圖所示

n輪狀病毒的產生規律是在乙個n輪狀基中刪去若干條邊,使得各原子之間有唯一的資訊通道,例如共有16個不

同的3輪狀病毒,如下圖所示

現給定n(n<=100),程式設計計算有多少個不同的n輪狀病毒

第一行有1個正整數n

計算出的不同的n輪狀病毒數輸出316

每種n輪狀病毒對應著一種不同的生成樹

同樣,n+1個點的生成樹對應著不同的n輪狀病毒

所以 n輪狀病毒的種數 ==

n+1個點,已知每個點可以連出的邊 的生成樹的個數

現在問題轉化為求生成樹的個數

矩陣樹定理即可

但是不寫高精只能做到50分

然後你可以根據這個打表找出規律(我沒找出來)

f[i]=3*f[i-1]-f[i-2]+2

再寫個高精就a了

矩陣樹定理打表**:

#include#include

#include

#include

using

namespace

std;

typedef

long

long

ll;int c[101][101

];int

n;void

matrix_tree()

else

if(n==2

)

else

ll ans=1

,t;

for(int i=1;i<=n;i++)

ans*=c[i][i];

}if(ans<0) ans=-ans;

cout

}int

main()

ac**

#include#include

using

namespace

std;

struct

node

node

operator * (int p) const

node

operator -(node p)

a.len=len;

while(len && !a.num[a.len]) len--;

return

a; }

node

operator + (int

p)

void

operator =(node p)

void

print()

};node f[

101];

intmain()

FJOI2007 輪狀病毒

提交傳送門 就是公式嘛 f i f i 1 3 f i 2 description 輪狀病毒有很多變種,所有輪狀病毒的變種都是從乙個輪狀基產生的。乙個n輪狀基由圓環上n個不同的基原子和圓心處乙個核原子構成的,2個原子之間的邊表示這2個原子之間的資訊通道。如下圖所示 n輪狀病毒的產生規律是在乙個n輪狀...

FJOI2007 輪狀病毒

輪狀病毒有很多變種。許多輪狀病毒都是由乙個輪狀基產生。乙個n輪狀基由圓環上n個不同的基原子和圓心的乙個核原子構成。2個原子之間的邊表示這2個原子之間的資訊通道,如圖1。n輪狀病毒的產生規律是在n輪狀基中刪除若干邊,使各原子之間有唯一一條資訊通道。例如,共有16個不同的3輪狀病毒,入圖2所示。給定n ...

2 4 高精度 FJOI2007 輪狀病毒

傳送門 暴力找規律 發現n 1 5時答案是1,5,16,45,121 奇數項是平方數,偶數項是平方數減4 1,5,16,45,121 分別是1 2,3 2 4,4 2,7 2 4,11 2 1,3,4,7,11這個數列有類似於斐波那契數列的性質,只不過前兩項是1和3罷了 那麼我們就可以遞推求這個類斐...