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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

UVA1646-Edge Case(递推+斐波那契数列)

發(fā)布時間:2023/12/29 编程问答 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 UVA1646-Edge Case(递推+斐波那契数列) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
Problem?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 100

Sample 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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。