hdu1438 钥匙计数一

来源:互联网 发布:二十二日本知乎 编辑:程序博客网 时间:2024/04/27 21:51

链接:http://acm.hdu.edu.cn/showproblem.php?pid=1438


第一次这么认真的做了一道递推的题目,好题啊!

要是自己想还是好吃力,看了解题报告感觉思路好清晰。看解题报告是很不好的习惯,可是菜没办法。。。。。。。。。。呼呼

递推方程:

1 如果X是钥匙,则X1/2/3/4也是。

2如果X不是钥匙,X2/3是。则X是由1和4组成的,除去全部由1或4组成的。

3如果X不是钥匙,X14和X41是。则前i-2位是由1,2,3,4组合成的。但要除去全是1和4的情况,还有就是X是钥匙且X是以1/4结尾
的情况。用b[i]数组表示i位时以1/4结尾的的数量。


#include<stdio.h>
#include<math.h>




#define N 35

int main()
{
__int64 a[N],b[N];//a[i]计算钥匙的总数,b[i]计算以1或4结尾的钥匙总数
__int64 temp;
int i;
a[2] = 0;
b[2] = 0;
a[3] = 8;
b[3] = 4;
for(i = 4;i<32;i++)
{
a[i] = a[i-1]*4;
a[i] += (__int64)(pow(2,i-1)*2)-4;//以2或3结尾的钥匙
temp = ((__int64)pow(4,i-2)-(__int64)pow(2,i-2))*2-b[i-1];
a[i] += temp;
b[i] = a[i-1]*2+temp;
}
for(i = 2;i<32;i++)
{
printf("N=%d: %I64d\n",i,a[i]);
}
return 0;
}

原创粉丝点击