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;
} 
posted @ 2025-07-15 21:50  crazy--boy  阅读(5)  评论(0)    收藏  举报