题意:这题看得好久才看懂。。。意思是给定长度为n的锁,给定m个区间,转动m个区间的密码会同时增1,问有几种不同的锁。
分析:并查集+快速幂,合并区间,计算区间数cnt,答案就是26^(n-cnt)
#include<stdio.h>
#include<algorithm>
#define N 10000005
#define mod 1000000007
using 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;
}