码迷,mamicode.com
首页 > 其他好文 > 详细

钥匙计数之一(递推)hdu1438

时间:2015-06-17 23:23:48      阅读:130      评论:0      收藏:0      [点我收藏+]

标签:递推   钥匙计数之一   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;
}


 

钥匙计数之一(递推)hdu1438

标签:递推   钥匙计数之一   hdu1438   

原文地址:http://blog.csdn.net/u010579068/article/details/46539539

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!