题意是说有N个字母组成的密码锁, 如【wersdfj】,   每一位上的字母可以转动, w可转动变成x, z变成a。但是题目规定, 只能同时转动某个区间上的所有字母, 如【1,3】, 那么第1到第3个的所有字母要同时转动,那么【 wersdfj 】经过一次操作就变成 【 xfssdfj 】.    一共有M 个区间是可以操作的。  

题目还规定:If a lock can change to another after a sequence of operations, we regard them as same lock. 

就是说, 经过可操作区间进行的操作得到的所有锁情况,都是同一个的。 也就是说,所有不同的锁就是“不可操作区间”的所有组合情况。

这题其实就是并查集+二分求幂。首先要求出可以活动的区间数x,一个区间等价于某一位的密码种类为1,那么得到的密码锁的种类为26^(n-x),因为n的数据较大,所以要用到二分求幂的方法。

  先来分析一下二分求幂:

hdu Code Lock

递归算法:

double powerWithUnsignedExponent(double base,unsigned int exponent)  
{  
    if(exponent==0)  
        return 1;  
    if(exponent==1)  
        return base;  
    double result=powerWithUnsignedExponent(base,exponent>>1);//exponent>>1即exponent/2   
    result*=result;  
    if(exponent & 0x1==1)//a & 0x1相当于a%2   
        result*=base;  
    return result;  
}  
View Code

相关文章:

  • 2022-12-23
  • 2022-02-03
  • 2022-12-23
  • 2021-07-20
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2021-10-05
猜你喜欢
  • 2022-12-23
  • 2021-05-18
  • 2022-12-23
  • 2022-12-23
  • 2021-04-06
  • 2021-05-26
  • 2022-12-23
相关资源
相似解决方案