HDU-1438 钥匙计数之一

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=1;
    for(i=1;i<=y;i++)
        sum*=x;
     return sum;
}
int main()
{
    __int64 temp,a[40],b[40];
    int i;
      a[2]=b[2]=0;
    a[3]=8;b[3]=4;
    for(i=4;i<=31;i++)
    {
        a[i]=a[i-1]*4;
        a[i]+=pow(2,i)-4;
        temp=(pow(4,i-2)-pow(2,i-2))*2-b[i-1];
        a[i]+=temp;
        b[i]=a[i-1]*2+temp;
    }
    for(i=2;i<=31;i++)
         printf("N=%d: %I64d\n",i,a[i]);
   return 0;

}

HDU-1438 钥匙计数之一,布布扣,bubuko.com

时间: 2024-10-24 12:04:25

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

【HDOJ】1438 钥匙计数之一

状态压缩.分最后一个槽的值以及当前的配置方案是否可以进行DP. 1 /* 1438 */ 2 #include <cstdio> 3 #include <cstring> 4 #include <cstdlib> 5 6 #define MAXN 32 7 8 const int MAXS = 1<<4; 9 10 __int64 dp[MAXN][MAXS][4][2]; 11 int cnt[1<<4]; 12 13 int abs(int

钥匙计数之一(递推)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 对

hdu 4909 String(计数)

题目链接:hdu 4909 String 题目大意:给定一个字符串,由小写字母组成,最多包含一个问号,问号可以表示空或者任意一个字母.问有多少个子串,字母出现的次数均为偶数. 解题思路:因为最多又26个字母,对应每个字母的奇数情况用1表示,偶数情况用0.将一个前缀串表示成一个二进制数.然后对于每种相同的数s,任选两个即为一种可行子串(组合数学). 接着对于有问号的情况枚举一下问号替代的字符,然后对于问号后面的状态都要再加上一个该字符.这时计算个数时就要将前后分开讨论了. 这题交C++,结果卡FS

HDU 4832 组合计数dp

Chess Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 509    Accepted Submission(s): 198 Problem Description 小度和小良最近又迷上了下棋.棋盘一共有N行M列,我们可以把左上角的格子定为(1,1),右下角的格子定为(N,M).在他们的规则中,"王"在棋盘上的走法遵循十字

HDU 6116 路径计数

HDU 6116 路径计数 普通生成函数常用于处理组合问题,指数生成函数常用于处理排列问题. 考虑 对于 $ a $ 个 $ A $ 分为很多堆,这么分的方案数是 $ C_{a-1}^{i-1} $ 然后对于每一堆我们看成一个数来放,并且所有堆都这样做,这样的话总的方案数量是 $ \frac{(i+j+k+l)!}{i!j!k!l!} $ 就算所有一堆看成的数的排列是不存在相邻相等的,至少都有 $ n-i-j-k-l $ 对相邻的相同的数. 然后就可以容斥了,枚举 $ i+j+k+l $ 直接计

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

分析:首先想到每个钥匙的结尾有4种状态,不过题目还需要判断有三种不同的钥匙深度,所以每种深度结尾后有2^4种状态,0000->1111,不过题目还需需要有相邻的钥匙深度大于等于3,所以需要两种不同的状态表示0表示没有出现过这样的,1表示出现过,然后开一个4维的数组进行状态转移就好了dp[MAXN][bit][1<<bit][2]. 代码如下: =========================================================================

HDU 4633(polya计数

题目:用k种颜色给一个魔方染色,可以染每个面的9个小矩形,12条棱,8个顶点(总之就是有74个能染的地方),空间旋转后一样的视为相同,问有多少种不同的染色方案. 思路:裸的polya计数,但是这个立方体的对称群本来就很容易弄错...<组合数学>里有个例题提到立方体的对称群有24个元素,分别是: (1)恒等变换. (2)以两个相对面的中心相连作为对称轴,旋转(i)90,(ii)180,(iii)270度,每种有3个.共9种. (3)以两个相对棱的中点连线为对称轴翻转180度,有6种. (4)固定

HDU 5701 中位数计数( 2016&quot;百度之星&quot; - 初赛(Astar Round2B) 思维 + 暴力)

传送门 中位数计数 Time Limit: 12000/6000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) Total Submission(s): 852 Accepted Submission(s): 335 Problem Description 中位数定义为所有值从小到大排序后排在正中间的那个数,如果值有偶数个,通常取最中间的两个数值的平均数作为中位数. 现在有n个数,每个数都是独一无二的,求出每个数在多少个包含

hdu 5701 中位数计数 思路题

中位数计数 Time Limit: 12000/6000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Submission(s): 909    Accepted Submission(s): 346 Problem Description 中位数定义为所有值从小到大排序后排在正中间的那个数,如果值有偶数个,通常取最中间的两个数值的平均数作为中位数. 现在有n个数,每个数都是独一无二的,求出每个数在多少个包