hdu3461Code Lock 快速幂+并查集

来源:互联网 发布:电信的网络尖兵限制了 编辑:程序博客网 时间:2024/05/20 11:34
//n个字母从a到z的字母组成的字母锁,m个区间[l,r]表示从l到r的所有字母可以同步增加//当一个字母锁能够由另一个通过有限次的增加操作变为另一个,就表示它们是同一个//问有多少个不同的字母锁//如果没有联动的区间,个数为26^n个,增加一个独立的联动的区间,那么个数为26^(n-1)//因为在这个区间内的26中情况数相同的,现在是要找有多少个独立的联动区间//对于一个区间[l,r],join(l,r+1)这样对于一个新的区间如果是将原来的分开的联动的区间总体联动的就可以去掉#include<cstdio>#include<cstring>#include<iostream>using namespace std ;typedef __int64 ll ;const int maxn = 10000010 ;const ll mod = 1000000007 ;int F[maxn] ;ll pow(int b){    ll c = 1 ;    ll a = 26 ;    while(b)    {        if(b&1)c = ((c%mod)*(a%mod))%mod;        a =(a*a)%mod ;        b >>= 1;    }    return c ;}int find(int x){    if(F[x] == 0)return x ;    return F[x] = find(F[x]) ;}bool join(int x , int y){    int fx = find(x) ;    int fy = find(y) ;    if(fx == fy)return false ;    F[fx] = fy ;    return true ;}int main(){    int n , m ;    while(~scanf("%d%d" , &n , &m))    {        memset(F , 0, sizeof(F)) ;        int sum = 0 ;        while(m--)        {            int l , r ;            scanf("%d%d" ,&l , &r) ;            if(join(l , r+1))            sum++ ;        }        printf("%I64d\n" , pow(n - sum)) ;    }    return 0 ;}
0 0