不错的一个并查集的题目= - =应该是套路题吧...
把必须相同的归为一类,然后m^t即是答案,因为每一类都有m种选择.
代码如下:
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=2e3+5;
const int mod=1e9+7;
int fa[N],vis[N];
int f(int x)
{
if(x==fa[x]) return x;
else return fa[x]=f(fa[x]);
}
ll qp(ll a,ll b)
{
ll res=1;
while(b)
{
if(b&1) res=res*a%mod;
a=a*a%mod;
b>>=1;
}
return res;
}
int main()
{
ll n,m,k;
scanf("%lld%lld%lld",&n,&m,&k);
for(int i=1;i<=n;i++) fa[i]=i;
for(int i=1;i+k-1<=n;i++)
{
int len=i+k-1;
for(int j=0;j<k;j++)
{
int x=f(i+j),y=f(len-j);
if(x!=y) fa[y]=x;
}
}ll t=0;
for(int i=1;i<=n;i++)
{
if(!vis[f(i)]) t++,vis[f(i)]=1;
}
ll ans=qp(m,t);
printf("%lld\n",ans);
return 0;
}
京公网安备 11010502036488号