Code Lock

题目链接

http://acm.hdu.edu.cn/showproblem.php?pid=3461

Problem Description

A lock you use has a code system to be opened instead of a key. The lock contains a sequence of wheels. Each wheel has the 26 letters of the English alphabet 'a' through 'z', in order. If you move a wheel up, the letter it shows changes to the next letter in the English alphabet (if it was showing the last letter 'z', then it changes to 'a').

At each operation, you are only allowed to move some specific subsequence of contiguous wheels up. This has the same effect of moving each of the wheels up within the subsequence.

If a lock can change to another after a sequence of operations, we regard them as same lock. Find out how many different locks exist?

Input

There are several test cases in the input.

Each test case begin with two integers N (1<=N<=10000000) and M (0<=M<=1000) indicating the length of the code system and the number of legal operations.

Then M lines follows. Each line contains two integer L and R (1<=L<=R<=N), means an interval [L, R], each time you can choose one interval, move all of the wheels in this interval up.

The input terminates by end of file marker.

Output

For each test case, output the answer mod 1000000007

Sample Input

    1 1
1 1
2 1
1 2

Sample Output

    1
26

题意

1.问题:问你用26个小写字母,能组成长度为n的多少种不同的序列。

2.操作:他会给你m个操作区间,形如[l,r],每次你可以令一个区间里的所有字母往后一位,如a变成b,z变成a.

3.种类判定:如果两个序列进行若干次操作可以变成相同形态,则视为一种序列。

题解

老实说我看了很多题解,但是并没有完全理解,可能是我太弱了,我就大概说一下我自己的一知半解。

1.如果没有操作区间,答案记作\(\large sum=26^n\).

2.假如只有一个可操作的区间[l,r],每一种序列,都可以有26个同种不同样的序列(包括自己),则答案为\(\LARGE \frac{sum}{26}\).

3.如果m个操作区间均不重叠,那么答案为\(\LARGE \frac{sum}{26^n}\).

4.那么有重叠怎么办呢,有重叠实际上只要不是完全一样似乎就没有影响,比如[1,2]和[2,3],对于每一种序列,可以有\(\large 26^2\)个同种不同样的序列。

5.那么什么是完全一样呢,比如[1,3],[4,5]和[1,5]就是完全一样,因为[1,5]的任何变换都可以由[1,3],[4,5]一起完成。

6.最后大牛们用了神奇的并查集,即对于[l,r],就将l和r+1并为同一个集合,记录每次成功合并的次数。(不用快速幂也不会超时)

代码

#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define INF 0x7f7f7f7f
#define N 10000050
const ll mo=1000000007;
int n,m,bl[N];
template<typename T>void read(T&x)
{
ll k=0; char c=getchar();
x=0;
while(!isdigit(c)&&c!=EOF)k^=c=='-',c=getchar();
if (c==EOF)exit(0);
while(isdigit(c))x=x*10+c-'0',c=getchar();
x=k?-x:x;
}
void read_char(char &c)
{while(!isalpha(c=getchar())&&c!=EOF);}
int find(int x){return x==bl[x]?x:bl[x]=find(bl[x]);}
bool merge(int x,int y)
{
x=find(x); y=find(y);
if(x==y)return 0;
bl[y]=x;
return 1;
}
ll kpow(ll x,ll p)
{
ll ans=1;
while(p)
{
if (p&1)ans=ans*x%mo;
p>>=1;
x=x*x%mo;
}
return ans;
}
void work()
{
read(n); read(m);
for(int i=1;i<=n+1;i++)bl[i]=i;
ll p=n,ans=1;
for(int i=1;i<=m;i++)
{
int x,y;
read(x); read(y);
y++;
if(merge(x,y))p--;
}
ans=kpow(26,p);
printf("%lld\n",ans);
}
int main()
{
#ifndef ONLINE_JUDGE
freopen("aa.in","r",stdin);
#endif
while(1)work();
}

HDU 3461 思维+并查集的更多相关文章

  1. HDU 4496 D-City(并查集,逆思维)

    题目 熟能生巧...常做这类题,就不会忘记他的思路了... //可以反过来用并查集,还是逐个加边,但是反过来输出...我是白痴.....又没想到 //G++能过,C++却wa,这个也好奇怪呀... # ...

  2. B - Rikka with Graph HDU - 5631 (并查集+思维)

    As we know, Rikka is poor at math. Yuta is worrying about this situation, so he gives Rikka some mat ...

  3. HDU 2818 (矢量并查集)

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=2818 题目大意:每次指定一块砖头,移动砖头所在堆到另一堆.查询指定砖头下面有几块砖头. 解题思路: ...

  4. 思维+并查集 hdu5652

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5652 题意: 输入T,接下来T个样例,每个样例输入n,m代表图的大小,接下来n行,每行m个数,代表图, ...

  5. hdu 1116 欧拉回路+并查集

    http://acm.hdu.edu.cn/showproblem.php?pid=1116 给你一些英文单词,判断所有单词能不能连成一串,类似成语接龙的意思.但是如果有多个重复的单词时,也必须满足这 ...

  6. Bipartite Graph hdu 5313 bitset 并查集 二分图

    题目:http://acm.hdu.edu.cn/showproblem.php?pid=5313 题意: 给出n个顶点,m条边,问最多添加多少条边使之构成一个完全二分图 存储结构: bitset   ...

  7. hdu 3081(二分+并查集+最大流||二分图匹配)

    Marriage Match II Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others ...

  8. 2015 ACM/ICPC Asia Regional Changchun Online HDU - 5441 (离线+并查集)

    题目:http://acm.hdu.edu.cn/showproblem.php?pid=5441 题意:给你n,m,k,代表n个城市,m条边,k次查询,每次查询输入一个x,然后让你一个城市对(u,v ...

  9. hdu 3536【并查集】

    hdu 3536 题意: 有N个珠子,第i个珠子初始放在第i个城市.有两种操作: T A B:把A珠子所在城市的所有珠子放到B城市.  Q A:输出A珠子所在城市编号,该城市有多少个珠子,该珠子转移了 ...

随机推荐

  1. 【概率论】2-2:独立事件(Independent Events)

    title: [概率论]2-2:独立事件(Independent Events) categories: Mathematic Probability keywords: Independent Ev ...

  2. 7月清北学堂培训 Day 6

    今天是钟皓曦老师的讲授~ 合并石子拓展: 合并任意两堆石子,每次合并的代价是这两堆石子的重量的异或值,求合并成一堆的最小异或和. 状态设置:f [ s ] 把 s 所对应的石子合并的最小代价: 那么答 ...

  3. python 识别鼠标左键点击

    #coding=utf- import pyHook import pythoncom # 监听到鼠标事件调用 def onMouseEvent(event): if(event.MessageNam ...

  4. Ubuntu start:未知任务:mysql

    在Ubuntu环境下,下载安装mysql但是到最后启动的时候却显示这一句话: start :未知任务:mysql 很纳闷,明明按照教程一步一步写的.后来才想起来,万能的方法,在前面加权限 sudo s ...

  5. linux查看服务安装目录redis

    如果用命令 which redis 或者 whereis redis 都找不到安装目录, 可使用以下办法: ps -aux | grep redis  或者ps -ef|grep redis 假如得到 ...

  6. 走进JavaWeb技术世界1:Web后端与J2EE的由来

    转自:微信公众号 码农翻身 这个问题来自于QQ网友,一句两句说不清楚,索性写个文章. 我刚开始做Web开发的时候,根本没有前端,后端之说. 原因很简单,那个时候服务器端的代码就是一切:接受浏览器的请求 ...

  7. Java并发指南3:并发三大问题与volatile关键字,CAS操作

    本文转载自互联网,侵删   序言 先来看如下这个简单的Java类,该类中并没有使用任何的同步. 01 final class SetCheck { 02 private int  a = 0; 03 ...

  8. go语言规范之方法集

    Go语言规范里定义的方法集的规则 Values Methods Receivers ----------------------------------------------- T (t T) *T ...

  9. 使用Vagrant配置本地开发环境

    从二零一四年开始使用vagrant+VirtualBox搭建linux开发环境,配置简单灵活,后台运行占用内存少,比vmware好用很多,果断弃用vmware转投vagrant的怀抱:无论是个人搭建开 ...

  10. 安卓 通过intent调用系统文件管理器打开指定路径目录

    安卓 通过intent调用系统文件管理器打开指定路径目录     转  https://blog.csdn.net/qq_34161388/article/details/78586247 当我们知道 ...