hdu 3461 Code Lock
8177 ワード
http://acm.hdu.edu.cn/showproblem.php?pid=3461
パラレルセットとべき乗型取り
この問題は主に操作できない区間を求めている.
View Code
パラレルセットとべき乗型取り
この問題は主に操作できない区間を求めている.
1 #include <cstdio>
2 #include <cstring>
3 #include <algorithm>
4 #include <iostream>
5 #define maxn 10000010
6 #define ll long long
7 using namespace std;
8 const int mod=1000000007;
9
10 int f[maxn];
11 int n,m;
12 int cnt=0;
13
14 void inti()
15 {
16 for(int i=0; i<=n+1; i++)
17 {
18 f[i]=i;
19 }
20 }
21
22 int find1(int x)
23 {
24 if(x==f[x]) return x;
25 return f[x]=find1(f[x]);
26 }
27
28 void merge1(int a,int b)
29 {
30 int fa=find1(a);
31 int fb=find1(b);
32 if(fa!=fb)
33 {
34 f[fb]=fa;
35 cnt++;
36 }
37 }
38
39 ll pow_mod(ll a,ll n)
40 {
41 if(n==0) return 1;
42 if(n==1) return a;
43 ll x=pow_mod(a,n/2);
44 ll ans=(ll)x*x%mod;
45 if(n%2==1) ans=ans*a%mod;
46 return ans;
47 }
48
49 int main()
50 {
51 while(scanf("%d%d",&n,&m)!=EOF)
52 {
53 inti();
54 cnt=0;
55 for(int i=0; i<m; i++)
56 {
57 int l,r;
58 scanf("%d%d",&l,&r);
59 merge1(l,r+1);
60 }
61 cout<<pow_mod(26,n-cnt)<<endl;
62 }
63 return 0;
64 }
View Code