1. 程式人生 > 其它 >【SSL】2125可可解金鑰

【SSL】2125可可解金鑰

技術標籤:DPSSL

【SSL】2125可可解金鑰

Time Limit:1000MS
Memory Limit:65536K

Description

摩爾莊園裡所有的快樂都由小摩爾們一起創造,一起分享,除了莊園入口,摩爾莊園的圍牆也是由小摩爾志願者重兵把守。
在這裡插入圖片描述

這些志願者在執勤的時候是不能說話,但是相鄰小摩爾們可以手牽手進行無聲交流。為了保證執勤的秩序,規定不允許4個或更多的人聯絡在一起。
  守衛莊園的小摩爾們每天數量不一。現在可可要回答出他們有多少種牽手方式,才能在他們的注目禮中,昂首挺胸步入摩爾莊園。
例如,總共有4個人,那麼可以有以下7種方式:
1,1,1,1
1,2,1
1,1,2

2,1,1
2,2
1,3
3,1
  你能不能幫助可可解決這個問題呢?

Input

共一行。一個1~10000的正整數n,表示共有n個小摩爾。

Output

共一行。輸出一個正整數表示n個小摩爾牽手的方式數目。

Sample Input

4

Sample Output

思路

設f[i]表示i個小摩爾牽手的方式數目。
f[i]=f[i-3]+f[i-2]+f[i-1]。
f[1]=1;
f[2]=2
f[3]=4;
4<=i<=n;
要高精加。

程式碼

#include<iostream>
#include<cstdio>
using namespace std;
long long n,len[3]; short f[3][10010]; void add(int x)//高精加 { long long i,lenth=max(len[0],max(len[1],len[2])); for(i=0;i<=lenth;i++) { f[x][i]+=f[(x+1)%3][i]+f[(x+2)%3][i]; f[x][i+1]+=f[x][i]/10; f[x][i]=f[x][i]%10; } if(f[x][i]>0) len[x]=i; else len[x]=lenth; return; } void output() {
long long i,x=n%3; for(i=len[x];i>=0;i--)//輸出 printf("%d",f[x][i]); return; } int main() { long long i; scanf("%lld",&n); f[1][0]=1; f[2][0]=2; f[0][0]=4; len[0]=len[1]=len[2]=0; for(i=4;i<=n;i++) add(i%3); output(); return 0; }