链接:http://acm.hdu.edu.cn/showproblem.php?pid=2045
思路:这一题,当n>3的时候,最后一个格才不会受到绝对限制,因此从n>=4开始考虑,题目要求,使第n格和第1格要不相同所以有两种情况
①第n-1格和第1格相同时,第n格有两种情况,而此时,因为第n-1格和第n格相同,所以第n-1格的颜色方法数就是第(n-2)*1格,即这个方法就是第(n-2)*2
②第n-1格和第1格不同时,此时最后一个只有一种颜色,而整个n格的颜色排列法就是第n-1格时候的方法数,即这个总的方法就是(n-1)
所以,整体n(n>=4)格的方法数为(n-2)*2+(n-1)
此题依旧注意:因为计算的数值过大, 申明变量时要用__int64,输出为:%I64d
代码为:
#include<stdio.h>
int main()
{
__int64 a[50];
int n, i;
while(scanf("%d", &n)!= EOF)
{
if(n>0 && n<=50)
{
a[1] = 3;
a[2] = 6;
a[3] = 6;
for(i=4;i<=n;i++)
{
a[i] = a[i-2]*2 + a[i-1];
}
printf("%I64d\n", a[n]);
}
}
}
链接:http://acm.hdu.edu.cn/showproblem.php?pid=2044
思路:看图会发现,蜜蜂从1->5和2->6是一样的,一次类推,只需要知道1到的下一个数字的间隔就可以,在列多几个数据发现,1-2,1-3,1-4,1-5的关系是啊x[b-a] = x[b-a-1]+x[b-a-2],所以就可以做出来了,这道题要注意的是,因为数据过大,定义数组时需要用到__int64,然后输出时用“%I64d”(为大写的i)
代码:
#include<stdio.h>
int main()
{
__int64 x[50];
int n, a, i, b, j;
int sum;
while(scanf("%d", &n)!= EOF)
{
for(i=0;i<n;i++)
{
scanf("%d%d", &a, &b);
if(a>0 && a<50 && b>0 && b<50 && a<b)
{
x[1] = 1;
x[2] = 2;
sum = b-a;
for(j=3;j<=sum;j++)
{
x[j] = x[j-1]+x[j-2];
}
printf("%I64d\n", x[sum]);
}
}
}
}