钥匙计数之一(递推)hdu1438
2015-06-17 23:02
309 查看
钥匙计数之一
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; }
相关文章推荐
- 浅谈Tomcat性能优化---配置优化
- 黑马程序员——Java基础——集合类Collection
- j2se学习笔记-线程基础
- Android学习第一课:自定义日志LogCat输出
- about NDK
- Android中Adapter之SimpleCursorAdapter使用
- java配置ueditor中解决“未找到上传文件”错误提示
- 【学习笔记】【C语言】变量的内存分析
- hadoop2.5.2+zookeeper3.4.6+hbase0.99.2
- Java并发编程-23-Fork/Join 框架概述
- 黑马程序员——Java基础——String类、StringBuffer和StringBuilder
- VB 6.0 - the first day
- 创业企业的股权分配
- eclipse 下安装hadoop2.5.2插件
- android学习笔记一 ---- android-sdk基础介绍
- web框架之cgi.FieldStorage()与数据提交
- 在ASP.NET 5项目中使用和调试外部源代码包
- CentOS 7.0编译安装配置mysql-5.6.20
- bootstrap 模态框
- H - 迷宫问题 POJ3984 (BFS+DFS)