HDU3461_Code Lock
Description
一排可以转动的密码锁,现在给你很多个区间,你可以操作同时转动这个区间内的密码锁,能够通过转动使之一样的密码锁为一种密码
如可以操作2~4这个区间:那么ABBB 和AAAA是一个密码
问你这个密码锁总共有多少种不同的密码
思路:
如果这题没有转动限制的话,那么答案很明显,就是(n为区间大小)26的n次方,但是由于可以转动所以有些锁的状态会重复,那么同一个状态重复了多少次呢!!!!设有cnt个可以自由移动的区间,那么重复次数就是26的cnt次方(想一想为什么,和数学的排列组合很像),那么除以重复次数就可以了
结果是26的(n-cnt)次方种不同的状态锁,显然要用到快速幂
现在最大的问题就是怎么求独立区间个数,
模拟过程:
现在有一个独立区间A[1,4]和B[5,8],现在多出来一个C区间[1,9],显然C任何一种状态都可由转动AB这两个得到,那么C的加入并没有增加新的独立区间,此时C=A+B,同理C=A-B也没有增加新的独立区间
容易发现没有增加新的独立区间的C有一个特点,C区间的两端已经"连在"了一起.
而这种是通过并查集实现的!!!只想说为什么这么神奇!!!!!每次增加一个区间的 时候就把区间左端点和右端点+1联合起来,如果一个新增加的区间左端和右端+1并没有在一个集合,说明这是一个独立区间,否则不是,就这样统计独立区间个数
然后用快速幂就好了
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<string>
#include<queue>
#include<cstdlib>
#include<algorithm>
#include<stack>
#include<map>
#include<queue>
#include<vector> using namespace std;
const int maxn = 1e7+100;
const int MOD = 1000000007;
#define pr(x) cout << #x << " = " << x << " ";
#define prln(x) cout << #x << " = " << x <<endl;
#define ll long long
int p[maxn];
int findset(int x) {
return p[x] = x == p[x]? x: findset(p[x]);
}
bool unite(ll x, ll y) {
x = findset(x), y = findset(y);
if(x == y) return false;
p[x] = y;
return true;
}
ll fun(ll x, ll m) {
ll ans = 1;
while(m) {
if(m & 1) ans = ans * x % MOD;
x = x * x % MOD;
m >>= 1;
}
return ans % MOD;
}
int main(){
#ifdef LOCAL
//freopen("C:\\Users\\User Soft\\Desktop\\in.txt","r",stdin);
//freopen("C:\\Users\\User Soft\\Desktop\\out.txt","w",stdout);
#endif
ll m, n, l, r, cnt;
while( scanf("%lld%lld", &n, & m) == 2) {
cnt = n;
for(int i = 0; i <= n; ++i) p[i] = i;
for(int i = 0; i < m; ++i) {
scanf("%lld%lld", &l, &r);
cnt -= unite(l - 1, r);
}
cout << (fun(26,cnt)+MOD)%MOD << "\n";
}
return 0;
}
HDU3461_Code Lock的更多相关文章
- C#各种同步方法 lock, Monitor,Mutex, Semaphore, Interlocked, ReaderWriterLock,AutoResetEvent, ManualResetEvent
看下组织结构: System.Object System.MarshalByRefObject System.Threading.WaitHandle System.Threading.Mutex S ...
- 多线程同步工具——Lock
本文原创,转载请注明出处. 参考文章: <"JUC锁"03之 公平锁(一)> <"JUC锁"03之 公平锁(二)> 锁分独占锁与共享锁, ...
- java 线程 Lock 锁使用Condition实现线程的等待(await)与通知(signal)
一.Condition 类 在前面我们学习与synchronized锁配合的线程等待(Object.wait)与线程通知(Object.notify),那么对于JDK1.5 的 java.util.c ...
- InnoDB:Lock & Transaction
InnoDB 是一个支持事务的Engine,要保证事务ACID,必然会用到Lock.就像在Java编程一下,要保证数据的线程安全性,必然会用到Lock.了解Lock,Transaction可以帮助sq ...
- 使用四元数解决万向节锁(Gimbal Lock)问题
问题 使用四元数可以解决万向节锁的问题,但是我在实际使用中出现问题:我设计了一个程序,显示一个三维物体,用户可以输入绕zyx三个轴进行旋转的指令,物体进行相应的转动. 由于用户输入的是绕三个轴旋转的角 ...
- 万向节锁(Gimbal Lock)的理解
[TOC] 结论 我直接抛出结论: Gimbal Lock 产生的原因不是欧拉角也不是旋转顺序,而是我們的思维方式和程序的执行逻辑没有对应,也就是说是我们的观念导致这个情况的发生. 他人解释 首先我们 ...
- 在多线程编程中lock(string){...}隐藏的机关
常见误用场景:在订单支付环节中,为了防止用户不小心多次点击支付按钮而导致的订单重复支付问题,我们用 lock(订单号) 来保证对该订单的操作同时只允许一个线程执行. 这样的想法很好,至少比 lock( ...
- 谈谈 Lock
上来先看MSDN关于lock的叙述: lock 关键字将语句块标记为临界区,方法是获取给定对象的互斥锁,执行语句,然后释放该锁. 下面的示例包含一个 lock 语句. lock 关键字可确保当一 ...
- LOCK TABLES和UNLOCK TABLES与Transactions的交互
LOCK TABLES对事务不安全,并且在试图锁定表之前隐式提交任何活动事务. UNLOCK TABLES只有在LOCK TABLES已经获取到表锁时,会隐式提交任何活动事务.对于下面的一组语句,UN ...
随机推荐
- go中基本数据类型的默认值
代码 // 基本数据类型(整型,浮点型,字符串型,布尔型)的默认值 package main import ( "fmt" ) func main() { var a int va ...
- 2018-2-13-win10-UWP-RSS阅读器
title author date CreateTime categories win10 UWP RSS阅读器 lindexi 2018-2-13 17:23:3 +0800 2018-2-13 1 ...
- 2019-1-24-WPF-文字描边
title author date CreateTime categories WPF 文字描边 lindexi 2019-01-24 19:47:18 +0800 2019-1-24 19:40:7 ...
- ELKStack之操作深入(中)
ELKStack之操作深入(中) 链接:https://pan.baidu.com/s/1V2aYpB86ZzxL21Hf-AF1rA 提取码:7izv 复制这段内容后打开百度网盘手机App,操作更方 ...
- Linux设备驱动详解 宋宝华 硬件基础
处理器 存储器 接口与总线 I2C时序 SPI总线时序 以太网
- WPF 几种常用控件样式的总结
这里把wpf中几种常用样式总结一下,后期可以直接拷贝使用,呵呵 一.Button <ResourceDictionary xmlns="http://schemas.microsoft ...
- 前端每日实战:49# 视频演示如何用纯 CSS 创作一支诱人的冰棍
效果预览 按下右侧的"点击预览"按钮可以在当前页面预览,点击链接可以全屏预览. https://codepen.io/comehope/pen/vrxzMw 可交互视频教程 此视频 ...
- Linux命令"ls"进阶说明
pwd:the current working directory cd -: return to the previous working directory Filenames that begi ...
- boost Shared Memory
Shared Memory Shared memory is typically the fastest form of interprocess communicatioin. It provide ...
- promise函数
一.promise函数是干什么的 promise函数是解决异步编程调用代码逻辑编写过于复杂的问题的,当网络请求非常复杂时,就会出现回调地狱,这样如果将这些代码写在一起就会看起来很复杂,且不利于阅读,如 ...