http://acm.hdu.edu.cn/showproblem.php?pid=1438                                钥匙计数之一

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

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

分析:若x是钥匙,则x加1,2,3,4.都是钥匙则a[i]=a[i-1]*4;
        若x不是钥匙,加上2,3。就是钥匙了,这x是由1和4组成。但是要减去x是全1或者全4。a[i]+=(2^i-1-2)*2;
        若x不是钥匙,加上1,4就是钥匙但是要减去x是由1和4组成。还要除去b[i-1],表示以1和4为结尾的个数,因为i的位置是1和4,i-1的位置就必修是4和1来配对,但是前面的计算,可能会造成i-2的位置有1和4,这样就不符合x不是钥匙,而且什么当x是钥匙的时候,已经算了一次,所以要除去i-1位置以1和4结尾的。
  temp=(4^i-2-2^i-2)*2-b[i-1].
  而此时,b[i]=a[i-1]*2+temp,a[i-1]*2是i-1是钥匙,然后加上1和4,temp上面本来就是结尾加上1和4.
#include<iostream>
#include<cstdio>
#include<cmath>
using namespace std;
__int64 pow(int x,int y)
{
int i;
__int64 sum=;
for(i=;i<=y;i++)
sum*=x;
return sum;
}
int main()
{
__int64 temp,a[],b[];
int i;
a[]=b[]=;
a[]=;b[]=;
for(i=;i<=;i++)
{
a[i]=a[i-]*;
a[i]+=pow(,i)-;
temp=(pow(,i-)-pow(,i-))*-b[i-];
a[i]+=temp;
b[i]=a[i-]*+temp;
}
for(i=;i<=;i++)
printf("N=%d: %I64d\n",i,a[i]);
return ; }
 
 
 
 

HDU-1438 钥匙计数之一的更多相关文章

  1. HDU 1438 钥匙计数之一(状压DP)题解

    思路: 每个槽有4种深度,一共有2^4种状态.然后开4维来保存每一次的状态:dp[ 第几个槽 ][ 当前状态 ][ 末尾深度 ][ 是否符合要求 ]. 代码: #include<cstdio&g ...

  2. 【HDOJ】1438 钥匙计数之一

    状态压缩.分最后一个槽的值以及当前的配置方案是否可以进行DP. /* 1438 */ #include <cstdio> #include <cstring> #include ...

  3. hdu 5868 Polya计数

    Different Circle Permutation Time Limit: 3000/1500 MS (Java/Others)    Memory Limit: 262144/262144 K ...

  4. hdu 2865 Polya计数+(矩阵 or 找规律 求C)

    Birthday Toy Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Tota ...

  5. HDU 6116 路径计数

    HDU 6116 路径计数 普通生成函数常用于处理组合问题,指数生成函数常用于处理排列问题. 考虑 对于 $ a $ 个 $ A $ 分为很多堆,这么分的方案数是 $ C_{a-1}^{i-1} $ ...

  6. 钥匙计数之一 - HDU 1438(状态压缩打表)

    分析:首先想到每个钥匙的结尾有4种状态,不过题目还需要判断有三种不同的钥匙深度,所以每种深度结尾后有2^4种状态,0000->1111,不过题目还需需要有相邻的钥匙深度大于等于3,所以需要两种不 ...

  7. sort(hdu oj 1425)计数排序和快速排序

    Description 给你n个整数,请按从大到小的顺序输出其中前m大的数. Input 每组测试数据有两行,第一行有两个数n,m(0 < n,m < 1000000),第二行包含n个各不 ...

  8. HDU 6348 序列计数 (树状数组 + DP)

    序列计数 Time Limit: 4500/4000 MS (Java/Others)    Memory Limit: 262144/262144 K (Java/Others)Total Subm ...

  9. hdu 4455 Substrings(计数)

    题目链接:hdu 4455 Substrings 题目大意:给出n,然后是n个数a[1] ~ a[n], 然后是q次询问,每次询问给出w, 将数列a[i]分成若干个连续且元素数量为w的集合,计算每个集 ...

随机推荐

  1. DML、DDL、DCL区别

    1.DML:数据操纵语言.执行完需要提交,有回滚. select.insert.update.delete.call explain plan :Oracle RDBMS执行每一条SQL语句,都必须经 ...

  2. python 处理 Excel 表格

    see: http://www.cnblogs.com/sunada2005/p/3193300.html 一.可使用的第三方库 python中处理excel表格,常用的库有xlrd(读excel)表 ...

  3. kmalloc/kfree,vmalloc/vfree函数用法和区别

    http://blog.csdn.net/tigerjibo/article/details/6412881 kmalloc/kfree,vmalloc/vfree函数用法和区别 1.kmalloc ...

  4. 239. Sliding Window Maximum

    题目: Given an array nums, there is a sliding window of size k which is moving from the very left of t ...

  5. HDU5086——Revenge of Segment Tree(BestCoder Round #16)

    Revenge of Segment Tree Problem DescriptionIn computer science, a segment tree is a tree data struct ...

  6. rhel-server-7.2-x86_64无法联网(VMware环境)

    vim /etc/sysconfig/network-script vim ifcfg-eno16777736 (编辑网卡名) 将ONBOOT=NO更改为YES (启动network服务时是否启用该网 ...

  7. Java发送Http请求

    package com.liuyu.test; import java.io.BufferedReader; import java.io.IOException; import java.io.In ...

  8. python处理Excel

    Python中一般使用xlrd库来读取Excel文件,使用xlwt库来生成Excel文件,使用xlutils库复制和修改Excel文件.这三个库只支持到Excel2003. python-excel主 ...

  9. ubuntu下安装Ming的教程

    Ming是一个操纵swf(flash movice)的C库,支持php. ruby. python等语言. 重要提示: 在安装Ming之前,应该准备好你的系统,特别是Linux/Unix系统,如果你对 ...

  10. POJ 1707 Sum of powers(伯努利数)

    题目链接:http://poj.org/problem?id=1707 题意:给出n 在M为正整数且尽量小的前提下,使得n的系数均为整数. 思路: i64 Gcd(i64 x,i64 y) { if( ...