我們可以仔細想一下。
我們只看一個區間。任何一種情況這個區間有26種變化。
如果總體有n個字符的話,有一個區間的話,那麼一共有26^(n-1)種可能。
如果有多個區間的話,每個區間可以看成是獨立的,如果有x個區間,那麼有26^(n-x)種可能。
但是有些區間比如【1,3】,【4,5】區間和【1,5】區間是相同的。動【1,5】區間的話,就相當於動【1,3】【4,5】區間。
那麼就用並查集來查找究竟有幾個區間。
#include#include #include #include #include using namespace std; #define INF 99999999 const int maxn =600; const int maxm =360000; const int oo = 1<<29; int f[11000000]; #define mod 1000000007 #define LL __int64 int find(int x) { while(x!=f[x])x=f[x]; return x; } LL mul(LL a,LL b) { if(b==0)return 1; if(b==1)return a; LL c=mul(a,b/2); c=(c*c)%mod; if(b&1)c=(c*a)%mod; return c; } int main() { int n,m,a,b,i; while(~scanf("%d%d",&n,&m)) { for(i=0;i<=n;i++)f[i]=i; LL ans=n; for(i=1;i<=m;i++) { scanf("%d%d",&a,&b); a=find(a-1); b=find(b); if(a==b)continue; f[b]=a; ans--; } cout<