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 ...
随机推荐
- seaborn教程4——分类数据可视化
https://segmentfault.com/a/1190000015310299 Seaborn学习大纲 seaborn的学习内容主要包含以下几个部分: 风格管理 绘图风格设置 颜色风格设置 绘 ...
- 如何在linux命令行无界面下使用selenium
1.安装Xvfb和pyvirtualdisplay sudo apt-get install xvfbpip install pyvirtualdisplay 2.安装chrome, chromedr ...
- ArrayList与List<T>的区别
ArrayList alist = new ArrayList(); //ArrayList(object value),所以ArrayList可以存储任何类型,如果存储值类型的话会进行装箱操作,在操 ...
- Windows程序设计--(一)起步
1.3 你的第一个Windows程序 1.3.2 Windows 对应程序 #include <windows.h> int WINAPI WinMain(HINSTANCE hInsta ...
- 安装weblogic界面安装
如果中间有任何问题请联系作者:291562721 界面安装weblogic首先 需要工具: 链接:https://pan.baidu.com/s/1x3uYxsnycjT2Xi2TOTbDdQ 提取码 ...
- 创建一个java项目并部署到weblogic服务器
转自:https://blog.csdn.net/krystal_sl/article/details/52847953 新建一个项目的步骤 打开eclipse,右键点击new–>java pr ...
- 4.ireport基本使用
转自:https://wenku.baidu.com/view/104156f9770bf78a65295462.html 第一部分,下载与安装 Ireport官网:http:// jasperfor ...
- Java疯狂讲义笔记——内部类
[定义]内部类:定义在其它类内部的类.外部类:包含内部类的类,也称 宿主类.局部内部类:定义在方法里的内部类. [接口内部类]接口中也可以定义内部类,必须为public static修饰(自动添加), ...
- pychrome激活
http://blog.csdn.net/fx677588/article/details/58164902
- Flutter的DateTime轉換的各種方法
概述: 表示一个时间点 通过构造函数或解析格式化的字符串创建DateTime对象,并且符合ISO 8601标准的子集,小时是24小时制,范围在0-23之间 DateTime对象创建之后,将是固定不变的 ...