Loading

忘却录音(Hard Version)

Link

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;
}
posted @ 2021-03-16 19:37  金木换  阅读(206)  评论(0)    收藏  举报