HDU 3461 Code Lock

来源:互联网 发布:腾讯ec软件 编辑:程序博客网 时间:2024/05/22 04:43

题目链接

题意:这题看得好久才看懂。。。意思是给定长度为n的锁,给定m个区间,转动m个区间的密码会同时增1,问有几种不同的锁。

分析:并查集+快速幂,合并区间,计算区间数cnt,答案就是26^(n-cnt)

#include<stdio.h>#include<algorithm>#define N 10000005#define mod 1000000007using namespace std;int par[N];int V,E;void init(int n){    for(int i=0;i<=n;i++)    {        par[i]=i;    }    return ;}int find(int x){    if(par[x]==x)    return x;    else    return par[x]=find(par[x]);}void unite(int x,int y){    x=find(x);    y=find(y);    if(x==y)    return ;    par[x]=y;    return ;} bool same(int x,int y)//判断x和y是否属于同一个集合 {    return find(x)==find(y);}long long pow1(long long a,long long b){    long long base=a%mod;    long long res=1;    while(b)    {        if(b&1)        res*=base;        res%=mod;        base=base*base%mod;        b>>=1;    }    return res%mod;}int main(void){    int n,m;    while(scanf("%d%d",&n,&m)==2)    {        init(n);        int cnt=0;        while(m--)        {            int l,r;            scanf("%d%d",&l,&r);            if(!same(l-1,r))            {                unite(l-1,r);                cnt++;            }        }        printf("%lld\n",pow1(26,n-cnt)%mod);    }    return 0;}
0 0