题意是说有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的数据较大,所以要用到二分求幂的方法。

先来分析一下二分求幂:

递归算法:

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

非递归算法:

int power(int a,int b)
{
int ans=;
while(b!=)
{
if(b%==)
ans*=a;
b/=;
a*=a;
}
return ans;
}

再来分析一下这道题的区间判定问题,这题给出的区间可能会存在重叠的情况。例如[1,4]、[4,6]和[1,6],这个应该算3个区间,因为第三个区间不能由前两个区间组合得到。二

[1,4]、[5,6]和[1,6]却只能算两个区间,因为最后一个区间的所有情况可以由前两个区间得到。

所以这题的思路就是:

1、求出所有的区间个数,注意区间重复和重叠的情况,这里用了一个很巧妙的方法,可以把原来的区间左边界减一,这样就可以很简单的避免上面的问题了。

2、用二分幂的方法求出最终的结果。

这里注意int还是不够用的,要用64位整型:

#include"iostream"
#include"stdio.h"
#include"algorithm"
#include"string"
#include"string.h"
#include"cmath"
#include"queue"
#include"stack"
#include"vector"
using namespace std;
const int mx=;
const int inf=;
int fa[mx];
int cnt;
int n,m; void Set()
{
int i;
for(i=;i<=n;++i)
fa[i]=i;
} int Find(int x)
{
int t1,t2=x;
while(t2!=fa[t2]) t2=fa[t2];
while(x!=t2)
{
t1=fa[x];
fa[x]=t2;
x=t1;
}
return t2;
} bool Union(int x,int y)
{
int fx=Find(x);
int fy=Find(y);
if(fx==fy)
return false;
else
{
fa[fx]=fy;
return true;
}
}
long long binary_power(int N)
{
long long base=,res=;
while(N)
{
if(N&)
{
res=(res*base)%inf;
}
N/=;
base=(base*base)%inf;
}
return res;
}
void IO()
{
while(scanf("%d%d",&n,&m)==)
{
int i,l,r;
cnt=;
Set();
for(i=;i<m;i++)
{
scanf("%d%d",&l,&r);
l--;
if(Union(l,r)) cnt++;
}
printf("%lld\n",binary_power(n-cnt)%inf);
}
}
int main()
{
// freopen("E:\\in.txt","r",stdin);
IO();
return ;
}

hdu Code Lock的更多相关文章

  1. Code Lock[HDU3461]

    Code LockTime Limit: 2000/1000 MS (Java/Others) Memory Limit: 131072/65536 K (Java/Others)Total Subm ...

  2. Code Lock

    Code Lock Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 131072/65536 K (Java/Others) Total Su ...

  3. HDU 3461 Code Lock(并查集+二分求幂)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3461 A lock you use has a code system to be opened in ...

  4. HDU 3461 Code Lock(并查集)

    很好的一个题,思想特别6 题意:给你小写字母个数n,每个字母可以向上翻动,例如:d->c,a->z.然后给你m对数(L,R)(L<=R),表示[L,R]之间可以同时向上翻动,且翻动后 ...

  5. hdu 3461 Code Lock

    http://acm.hdu.edu.cn/showproblem.php?pid=3461 并差集和幂取模 这道题主要是求不可操作区间. #include <cstdio> #inclu ...

  6. HDU 3461 Code Lock(并查集,合并区间,思路太难想了啊)

    完全没思路,题目也没看懂,直接参考大牛们的解法. http://www.myexception.cn/program/723825.html 题意是说有N个字母组成的密码锁,如[wersdfj],每一 ...

  7. hdu 3461 Code Lock(并查集)2010 ACM-ICPC Multi-University Training Contest(3)

    想不到这还可以用并查集解,不过后来证明确实可以…… 题意也有些难理解—— 给你一个锁,这个所由n个字母组成,然后这个锁有m个区间,每次可以对一个区间进行操作,并且区间中的所有字母要同时操作.每次操作可 ...

  8. HDU 3461 Code Lock(并查集的应用+高速幂)

    * 65536kb,仅仅能开到1.76*10^7大小的数组. 而题目的N取到了10^7.我開始做的时候没注意,用了按秩合并,uset+rank达到了2*10^7所以MLE,所以貌似不能用按秩合并. 事 ...

  9. hdu 3461 Code Lock 并查集(有点难想到)★★

    #include<stdio.h> #include<math.h> ]; int count; #define mod 1000000007 int find(int x) ...

随机推荐

  1. 非正规写法获取不到tr,td

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  2. Android Studio使用第三方类库

    导入*.jar包 新建好了Android项目,添加一个第三方已经打包好的jar文件进你项目,下面就已添加一个odata4j的一个包 在项目中添加一个libs文件 直接通过COPY/PAST 把你下载的 ...

  3. poj 2115 Looooops

    C Looooops Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 23637   Accepted: 6528 Descr ...

  4. mongodb学习04 操作详解(2)

    查找文档 筛选查找 db.collection.find(); 返回一个集合中文档的子集,子集的 范围从 0 个文档到整个集合; db.collection.findOne(); 返回筛选的一个文档; ...

  5. Java类与对象的基础学习

    1. 请输入并运行以下代码,得到什么结果? public class Test{ public static void main(String args[]){ Foo obj1=new Foo(); ...

  6. 编写css相关注意事项以及小技巧

    一.小技巧 1.对于开始写网站css之前一般都要对css进行重置(养成写注释的习惯): ;;} body{font-size:16px;} img{border:none;} li{list-styl ...

  7. 虚拟机CentOS-mini安装完成后的网络设置

    系统环境:虚拟机, CentOS-mini,x86-64, 1. 主机名设置 涉及的文件: /etc/hostname;  /etc/sysconfig/network 1.1 在/etc/hostn ...

  8. git 学习笔记5--rm & mv,undo

    rm 删除文件 rm <file> #Unix删除文件 git rm <file> # git删除文件 git rm -f <file> # git强制删除文件 g ...

  9. Handling events in an MVVM WPF application

      Posted: June 30, 2013 | Filed under: MVVM, WPF, XAML |1 Comment In a WPF application that uses the ...

  10. Linux下统计高速网络中的流量

    netpps.sh统计每秒数据量,包含接收(RX)或发送(TX) netpps.sh eth0 #!/bin/bash INTERVAL=" # update interval in sec ...