Ivan的梦
时间限制(普通/Java):1000MS/3000MS 运行内存限制:65536KByte总提交:67 测试通过:26
描述
又是英语课,Ivan最讨厌英语课了,上课总是不知不觉就睡着了。这次Ivan做了一个神奇的梦,梦见了一长串码,“Ivan!”“啊!”Ivan很悲剧的被老师发现了正在睡觉,醒来的Ivan拼命的回想着那一串密码,没准儿那密码就是拯救世界的最终秘籍呢!隐约中Ivan想起来那一长串密码长度为n,好像只由(A,C,M)三种字符组成(可以只有其中一种或两种字符,但绝对不能有其他字符),并且这一串密码中不存在两个“M”相邻的情况,因为Ivan在梦中知道的某种特殊的秘密,所以不存在MM这种情况。
输入
输入数据包含多个测试实例,每个测试实例占一行,由一个整数n组成,表示这串密码的长度为n。(0<n<40)
输出
对于每个测试实例,请输出这串密码有多少种排列的可能性,每个答案占一行。
样例输入
1
2
样例输出
38
ac代码:
#include<stdio.h>
int main()
{
long long n;
long long a,b,c;int i;
while(scanf("%I64d",&n)!=EOF)
{
if(n==1)
{printf("3\n");continue;}
if(n==2)
{printf("8\n");continue;}
for(a=3,b=8,c=0,i=0;i<n-2;i++)
{
c=2*(a+b);
a=b;
b=c;
}
printf("%I64d\n",c);
}
return 0;
}
总结:
int main()
{
long long n;
long long a,b,c;int i;
while(scanf("%I64d",&n)!=EOF)
{
if(n==1)
{printf("3\n");continue;}
if(n==2)
{printf("8\n");continue;}
for(a=3,b=8,c=0,i=0;i<n-2;i++)
{
c=2*(a+b);
a=b;
b=c;
}
printf("%I64d\n",c);
}
return 0;
}
乍一看还真尼玛像一个排列组合的数学题,后来讲答案的时候真的一点都不想打死这个出题的人。。居然是找规律填数字。。。说的高大上点就是递归吧。
相当于这么一个数列{3,8,22,60.....}后一项是前两项的和的两倍。。。
既然是递归么。。我就想了一个函数的递归调用。。。输入40的时候尼玛当时我就木了。。。隔了5还是6秒还是更长时间才出来。。。后来易彰彪说用在循环里面递归。。。然后朕就想了abc这么个方法。。。让a表示第前2项。。b表示第前一项。。。然后循环n-2次就ok。很晚了 朕睡了,众爱卿跪安!