密码锁(并查集+快速幂 C++)

密码锁
总时间限制: 5000ms 内存限制: 524288kB
描述
世界上有一种圆筒形密码锁,这种锁有n位,每一位是a-z中的任意一个字母,这种锁一共有m个可操作的区间,对于每个区间都可以整体向上转动(可以转动多次)。比如abc向上转一下就是bcd,zab向上转一下就是abc(z向上转就是a)。你可以同时转动每个区间内的密码锁,能够通过转动使之一样的密码锁为同一种密码,问你这个密码锁总共有多少种不同的密码。
(如可以操作2-4这个区间,那么ABBB和AAAA就是同一个密码。)
输入
输入有一系列测试样例,每个测试样例包含两个整数N(1<=N<=100000000)和M(0<=M<=1000000),分别代表圆筒形密码锁的长度和可操作的区间数量。
接下来M行。每行包含两个整数L和R(1<=L<=R<=N),表示一个可操作的区间。
输出
输出不同的密码数,答案对1000000007取模。
样例输入

1 1
1 1
2 1
1 2

样例输出

1
26

思路点拔:首先,我们走一走样例,第一个就不看了,那么第二个为什么是26种呢?我们可以这么想:首先确定一个区间,然后我们就去算另一个区间可取的情况有多少种,所以26就是这么来的,所以,本题就是用并查集去对输入的两个数作为等价类去进行合并,然后,答案就是26的(n-合并次数)次方,所以,代码应该很明确了,就是要注意:由于本题的数据非常大,所以我们需要进行读入优化,否则会超时,求26的幂就是需要用一个二分思想的快速幂来进行计算,否则也会超

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值