可可解密钥
题目
摩尔庄园里所有的快乐都由小摩尔们一起创造,一起分享,除了庄园入口,摩尔庄园的围墙也是由小摩尔志愿者重兵把守。
这些志愿者在执勤的时候是不能说话,但是相邻小摩尔们可以手牵手进行无声交流。为了保证执勤的秩序,规定不允许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
7
解析
不要看题目那么麻烦,实际上就是一个高精加
a[1]=1,a[2]=2,a[3]=4,a[x(x>=4)]=a[x-1]+a[x-2]+a[x-3]
水题
code:
#include<cstdio>
#include<cstring>
#define maxn 2647//投机取巧,n=10000时有2647位
using namespace std;
short int a[4][maxn+1],n,t=maxn;//加一手滚动
void add()//高精加
{
for(int i=1;i<=maxn;i++)
{
a[3][i]+=a[0][i]+a[1][i]+a[2][i];
a[3][i+1]+=a[3][i]/10;
a[3][i]%=10;
}
for(int i=1;i<=maxn;i++)a[2][i]=a[1][i],a[1][i]=a[0][i],a[0][i]=a[3][i],a[3][i]=0;
return;
}
int main()
{
scanf("%d",&n);
if(n==1)printf("1");
else if(n==2)printf("2");
else if(n==3)printf("4");
if(n<=3)return 0;//特判
memset(a,0,sizeof(a));
a[0][1]=4,a[1][1]=2,a[2][1]=1;//初值
n-=3;
while(n--)add();
while(a[0][t]==0)t--;
for(;t>=1;t--)printf("%d",a[0][t]);
return 0;
}