/*
这题程序不难,关键想法比较难,以下内容来自别人的空间
如果没有区间存在,答案是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;
}

results matching ""

    No results matching ""