【SSL】2125可可解金鑰
阿新 • • 發佈:2020-12-19
【SSL】2125可可解金鑰
Time Limit:1000MS
Memory Limit:65536K
Description
摩爾莊園裡所有的快樂都由小摩爾們一起創造,一起分享,除了莊園入口,摩爾莊園的圍牆也是由小摩爾志願者重兵把守。
這些志願者在執勤的時候是不能說話,但是相鄰小摩爾們可以手牽手進行無聲交流。為了保證執勤的秩序,規定不允許4個或更多的人聯絡在一起。
守衛莊園的小摩爾們每天數量不一。現在可可要回答出他們有多少種牽手方式,才能在他們的注目禮中,昂首挺胸步入摩爾莊園。
例如,總共有4個人,那麼可以有以下7種方式:
1,1,1,1
1,2,1
1,1,2
2,2
1,3
3,1
你能不能幫助可可解決這個問題呢?
Input
共一行。一個1~10000的正整數n,表示共有n個小摩爾。
Output
共一行。輸出一個正整數表示n個小摩爾牽手的方式數目。
Sample Input
4
Sample Output
7
思路
設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;
}