/* 这题程序不难,关键想法比较难,以下内容来自别人的空间 如果没有区间存在,答案是26^n,每增加一个区间,n-1(因为这个区间可以变成26种状态~). 但是要注意的是,比如已经有(1,10)和(1,3)在了,此时再增加(4,10)就没有作用了 使用并查集对于[l,r]我们将l,r+1两个点并起,如果新线段的两个点是同一个集合,就不用减了 */ #include <iostream> #include "UFS.h" #include <cmath> using namespace std; int mod = 1000000007; int exp(int a, int n); UFS ufs; int main() { int n,m, ans; while(cin>>n>>m) { ans = n; ufs.clear(); while(m--) { int a,b; cin>>a>>b; if(ufs.Find(a) != ufs.Find(b+1)) { ufs.Union(a, b+1); ans--; } } cout<<exp(26, ans)<<endl; } return 0; } //非递归求幂 int exp(int a, int n) { __int64 temp1 = 1, temp2 = a; while(n) { if(n & 1) temp1 =( temp1 * temp2 ) % mod; n>>=1; temp2 =( temp2 * temp2 ) % mod; } return temp1; }