CF150B Quantity of Strings
CF150B Quantity of Strings
思路
对于一个位置 \(i\),我们可以知道如果构建一个回文字符串,有哪些位置与他相等。我们把他们扔进一个集合。
最后,只需要统计有几个集合,然后答案就是 \(M\) 的几次方了(因为每个集合的每个位置到要想等,所以一个集合的选法只有 \(M\),再根据乘法原理,相乘即可)
代码
#include<bits/stdc++.h>
using namespace std;
const int Maxn=2010;
int f[Maxn];
long long n,m,k;
long long ans,mod=1e9+7;
int find(int x)
{
if(f[x]==x) return x;
else return f[x]=find(f[x]);
}
void merge(int x,int y)
{
f[find(x)]=find(y);
}
int main()
{
cin>>n>>m>>k;
ans=1;
for(int i=1;i<=n;i++) f[i]=i;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=k/2;j++)
{
if(i-j+k>n || i-j+1<1) continue;
// cout<<"merge "<<i<<" "<<i-j+k-j+1<<endl;
merge(i,i-j+k-j+1);
}
}
for(int i=1;i<=n;i++)
{
// cout<<f[i]<<" ";
if(f[i]==i) ans=ans*m%mod;
}
// cout<<endl;
cout<<ans;
}

浙公网安备 33010602011771号