钥匙计数之一(递推)hdu1438

钥匙计数之一

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 1471    Accepted Submission(s): 622


Problem Description
一把锁匙有N个槽,槽深为1,2,3,4。每锁匙至少有3个不同的深度且至少有1对相连的槽其深度之差为3。求这样的锁匙的总数。
 

Input
本题无输入
 

Output
对N>=2且N<=31,输出满足要求的锁匙的总数。
 

Sample Output
  
  
N=2: 0 N=3: 8 N=4: 64 N=5: 360 .. .. .. .. .. .. .. N=31: ... 注:根据Pku Judge Online 1351 Number of Locks或 Xi'an 2002 改编,在那里N<=16
 


转载请注明出处:寻找&星空の孩子 

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

 

 

/*
1:如果X是钥匙, 则X1/2/3/4也是, 所以a[I]=a[I-1]*4

2: 如果X不是, X2/3是则X由1/4组成, 但要除去全1和全4, 所以a[I]+=(2^(I-1)-2)*2
后缀2或者3加上就成为钥匙的话,必然是没满足需要3个不同深度槽这一项,故X必然由1/4组成

3 如果X不是 X1/4是。则X=Y(1/4) M=X1/4=Y(4/1)(1/4)

前I-2位可以是1234,但要除去全为1/4的情况 还有就是X是钥匙且X是以1/4结尾
的情况。我们用b[I]数组表示i位时以1/4结尾的的数量
   temp=(4^(i-2)-2^(i-2))* 2 – b[i-1];
则 b[i]=a[i-1]*2+temp;

*/

#include<stdio.h>
#define LL long long
#include<string.h>
LL a[35],b[35];
LL ppow(LL n,LL m)
{
    LL c=1;
    while(m)
    {
        if(m&1) c=c*n;
        n=n*n;
        m>>=1;
    }
    return c;
}
int main()
{
    a[0]=a[1]=a[2]=0;
    b[0]=b[1]=b[2]=0;
    LL temp=0;
    printf("N=2: 0\n");
    for(int i=3;i<=31;i++)
    {

        temp=(ppow(4,i-2)-ppow(2,i-2))*2-b[i-1];
 //       printf("temp=%lld\t",temp);
        b[i]=a[i-1]*2+temp;
        a[i]=a[i-1]*4+(ppow(2,i-1)-2)*2+temp;
        printf("N=%d: %lld\n",i,a[i]);
    }
    return 0;
}


 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值