题意:
解法1:
用并查集将所有字符必须相同的下标合并为一个集合。
最后统计有多少集合,假设有cnt个集合,则答案为m^cnt
#include <bits/stdc++.h>
using namespace std;
#define X first
#define Y second
#define int long long
#define PI pair<int, int>
const int maxm = 2e5 + 5;
const int mod=1e9+7;
int n,m,k;
int pre[maxm];
int ffind(int x){
return pre[x]==x?x:pre[x]=ffind(pre[x]);
}
void solve(){
cin>>n>>m>>k;
for(int i=1;i<=n;i++)pre[i]=i;
for(int i=1;i<=n;i++){
int l=i,r=i+k-1;
if(r>n)break;
while(l<r){
pre[ffind(l)]=ffind(r);
l++,r--;
}
}
int cnt=0;
for(int i=1;i<=n;i++){
if(ffind(i)==i){
cnt++;
}
}
int ans=1;
for(int i=1;i<=cnt;i++)ans=ans*m%mod;
cout<<ans<<endl;
}
signed main() {
// #define MULTI_CASE
ios::sync_with_stdio(0);
cin.tie(0);
#ifndef ONLINE_JUDGE
freopen("../in.txt", "r", stdin);
freopen("../out.txt", "w", stdout);
#endif
#ifdef MULTI_CASE
int T;
cin >> T;
while (T--)
#endif
solve();
return 0;
}
解法2:
手玩一下可以发现:
- k=1或k>n时。每个位置的字符可以随意选,因此答案为m^n
- k=n时。满足字符串是回文即可,字符串前半部分可以随意选,因此答案为((n+1)/2)^m
- k>1且k<n时。如果k是偶数,则所有字符都必须相同,答案为m。如果k是奇数,则字符串一定是ABABAB形式,前两个字符可以随意选,答案为m^2。
#include <bits/stdc++.h>
using namespace std;
#define X first
#define Y second
#define int long long
#define PI pair<int, int>
const int maxm = 2e5 + 5;
const int mod=1e9+7;
int n,m,k;
void solve(){
cin>>n>>m>>k;
if(k==1||k>n){
int ans=1;
for(int i=1;i<=n;i++)ans=ans*m%mod;
cout<<ans<<endl;
return ;
}
if(k==n){
int t=(k+1)/2;
int ans=1;
for(int i=1;i<=t;i++)ans=ans*m%mod;
cout<<ans<<endl;
return ;
}
if(k%2==0){
cout<<m<<endl;
} else {
cout<<m*m%mod<<endl;
}
}
signed main() {
// #define MULTI_CASE
ios::sync_with_stdio(0);
cin.tie(0);
#ifndef ONLINE_JUDGE
freopen("../in.txt", "r", stdin);
freopen("../out.txt", "w", stdout);
#endif
#ifdef MULTI_CASE
int T;
cin >> T;
while (T--)
#endif
solve();
return 0;
}