SSL_2125【可可解密钥】

可可解密钥

题目

摩尔庄园里所有的快乐都由小摩尔们一起创造,一起分享,除了庄园入口,摩尔庄园的围墙也是由小摩尔志愿者重兵把守。
这些志愿者在执勤的时候是不能说话,但是相邻小摩尔们可以手牵手进行无声交流。为了保证执勤的秩序,规定不允许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;
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值