UVA1646-Edge Case(递推+斐波那契数列)
Time Limit: 3000 mSec
Problem Description
?
?
Input
For each test case, you get a single line containing one positive integer: n, with 3 ≤ n ≤ 10000.
?
?Output
For each test case, a row containing the number of matchings in Cn.?Sample Input
3 4 100Sample Output
4
7
792070839848372253127
?
題解:這個題一看樣例就知道涉及高精度,不過只有加法,即便用C++寫也沒有什么難度,大致看了一下網(wǎng)上的題解,都是只說找規(guī)律沒有證明(可能是我沒翻到),因此在這里簡單做個說明。
?
?
首先設(shè)最終結(jié)果為a[n],遞推過程中需要引入一個中間序列b[n],b[n]的含義是強制讓1、2兩條邊不連的匹配數(shù)。由此我們得到第一個遞推式:
a[n] = b[n] + 2*b[n-1]
解釋一下,n的時候的所有成立的情況可以分為三類,
1、1號邊和2號邊都不連
2、1號邊連,2號邊不連
3、2號邊連,1號邊不連
第一種情況自然對應(yīng)b[n],第二種情況,如果1連,則1的左右兩條邊都不能連,這時看我引入的點P以及它連出的線段,它們將多邊形分成上下兩部分,只看上半部分,第二種情況的情況數(shù)就等于上半部分多邊形強制讓點P連的線段不連的情況數(shù),即b[n-1],第三種情況類似。
我們再找一個關(guān)系式就可以遞推了。從第一種情況入手,第一種情況等價于只有n-1個點時3號邊不連,那我們就求強制讓3不連的匹配數(shù),發(fā)現(xiàn)不太好求,那就求強制讓3連的匹配數(shù),如果3號邊連,那么它左右兩條邊都不能連,因此類似剛才的分析,匹配數(shù)等于b[n-1-1]=b[n-2],這樣一來得到如下關(guān)系式:
b[n] = a[n-1]-b[n-2]
有了這兩個關(guān)系式,解出數(shù)列a即可,基本操作,不再贅述。
1 #include <bits/stdc++.h> 2 3 using namespace std; 4 5 const int maxn = 10000 + 100; 6 7 int Fib[maxn][15010]; 8 int n; 9 10 void prepare() 11 { 12 Fib[3][0] = 1; 13 Fib[3][1] = 4; 14 Fib[4][0] = 1; 15 Fib[4][1] = 7; 16 for (int i = 5; i < maxn; i++) 17 { 18 for (int j = 1; j <= max(Fib[i - 1][0], Fib[i - 2][0]); j++) 19 { 20 Fib[i][j] += Fib[i - 1][j] + Fib[i - 2][j]; 21 Fib[i][j + 1] = Fib[i][j] / 10; 22 Fib[i][j] %= 10; 23 } 24 Fib[i][0] = max(Fib[i - 1][0], Fib[i - 2][0]); 25 if (Fib[i][Fib[i][0] + 1]) 26 Fib[i][0]++; 27 } 28 } 29 30 int main() 31 { 32 //freopen("input.txt", "r", stdin); 33 //freopen("output.txt", "w", stdout); 34 prepare(); 35 while (~scanf("%d", &n)) 36 { 37 for (int i = Fib[n][0]; i; i--) 38 printf("%d", Fib[n][i]); 39 printf("\n"); 40 } 41 return 0; 42 }?
轉(zhuǎn)載于:https://www.cnblogs.com/npugen/p/10405690.html
總結(jié)
以上是生活随笔為你收集整理的UVA1646-Edge Case(递推+斐波那契数列)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 计算机毕业设计Java微博系统网站(源码
- 下一篇: SRM520 DIVI-500pts