忘却录音(Hard Version)
cnt1: 不配对的对数 cnt2: 配对的对数
注意到每对不配对的数必须修改 并且可以选择修改一个或者修改两个
所以可以暴力枚举配对的数修改的对数 这样一来就可以知道不配对的数所需要产生的贡献tmp=k-2*修改的配对的对数.
设x为不配对的数中修改一个的对数,y为不配对的数中修改两个的对数.
n为偶数时可以得到两个方程 1.x+y=cnt1(即每一对都得修改) 2.x+2y=tmp 即可得出x和y;
n为奇数时分是否改变中间的数来讨论 如果不改变 方程1:x+y=cnt1 方程2:x+2y=tmp 如果不改变 方程1:x+y=cnt1 方程2: x+2y=tmp-1
都可以得出x和y 接下来就是组合数问题了 直接看代码吧
code
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
#define pb push_back
#define int long long
const int N = 3000005;
int n,k;
char s[N];
ll mod = 1000000007;
ll fac[3000001], invfac[3000001],inv[3000001];//2???
void init(ll n = 3000000)//???mod???
{
fac[0] = 1;
for (ll i = 1;i <= n;i++)
fac[i] = i * fac[i - 1] % mod;
inv[1] = 1;
for (ll i = 2;i <= n;i++)
inv[i] = mod - (mod / i) * inv[mod % i] % mod;
invfac[0] = 1;
for (ll i = 1;i <= n;i++)
invfac[i] = invfac[i - 1] * inv[i] % mod;
}
ll C(ll n, ll m)
{
return fac[n] * invfac[m] % mod * invfac[n - m] % mod;
}
int qpow(int a,int k)
{
int ans=1;
while(k)
{
if(k&1) ans = ans*a%mod;
a=a*a%mod;
k>>=1;
}
return ans;
}
signed main()
{
ios::sync_with_stdio(false);
init();
cin>>n>>k;
cin>>s+1;
int cnt1=0,cnt2=0;
for(int i=1;i<=n/2;i++)
{
int l=i,r=n+1-i;
if(s[l]==s[r]) cnt2++;
else cnt1++;
}
int ans=0;
for(int i=0;i<=cnt2;i++)
{
int tmp = k-i*2;
if(n%2==0)
{
if(tmp>cnt1*2) continue;
if(tmp<0) continue;
int x = 2*cnt1-tmp;
int y = tmp-cnt1;
if(x<0 || y<0) continue;
//ans = ans + C(cnt2,i)*qpow(25,i)*C(cnt1,x)*qpow(2,x)*qpow(24,y);
ans = ( ans + C(cnt2,i)*qpow(25,i)%mod*C(cnt1,x)%mod*qpow(2,x)%mod*qpow(24,y)%mod )%mod;
}
else
{
if(tmp>cnt1*2+1) continue;
if(tmp<0) continue;
//不改中间的
int x = 2*cnt1-tmp;
int y = tmp-cnt1;
bool f=true;
if(x<0 || y<0) f=false;
//ans = ans + C(cnt2,i)*qpow(25,i)*C(cnt1,x)*qpow(2,x)*qpow(24,y);
if(f) ans = ( ans + C(cnt2,i)*qpow(25,i)%mod*C(cnt1,x)%mod*qpow(2,x)%mod*qpow(24,y)%mod )%mod;
//改中间的
x = 2*cnt1-tmp+1;
y = tmp-cnt1-1;
bool f2=true;
if(x<0 || y<0) f2=false;
//ans = ans + C(cnt2,i)*qpow(25,i)*C(cnt1,x)*qpow(2,x)*qpow(24,y)*25;
if(f2) ans = ( ans + C(cnt2,i)*qpow(25,i)%mod*C(cnt1,x)%mod*qpow(2,x)%mod*qpow(24,y)%mod*25%mod )%mod;
}
}
cout<<ans;
}

浙公网安备 33010602011771号