P12840 [蓝桥杯 2025 国 A] OCR 校正 解题报告
题目大意
给定一个 长度为
在本题中
解题思路
~考场上被这道题卡了半个小时~
我们可以选择枚举第一次操作所操作的字符,这个字符可以是第
对第
其中
如果只对前面的
同理,只对后面
对这两种子串的操作是独立的。也就是说,对左子串的顺序已定的
由以上推导,最终答案为:
其中
可以对阶乘及其逆元预处理时间复杂度
AC Code
#include<bits/stdc++.h>
#define int long long
#define mod 1000000007
using namespace std;
int n,ans;
int fac[3000],inf[3000];
int re()
{
int x=0,p=1;
char y=getchar();
for(;y>'9'||y<'0';y=getchar())
if(y=='-')
p=-p;
for(;y>='0'&&y<='9';y=getchar())
x=x*10+y-'0';
return x*p;
}
void wr(int x)
{
if(x<0)
putchar('-'),x=-x;
if(x>9)
wr(x/10);
putchar(x%10+'0');
}
int ksm(int a,int b)
{
int ans=1;
for(;b;b>>=1,a*=a,a%=mod)
if(b&1)
ans*=a,ans%=mod;
return ans;
}
void pre()//预处理阶乘及其逆元
{
fac[0]=inf[0]=1;
for(int i=1;i<=n;i++)
fac[i]=fac[i-1]*i%mod;
inf[n]=ksm(fac[n],mod-2);
for(int i=n-1;i;i--)
inf[i]=inf[i+1]*(i+1)%mod;
}
signed main()
{
n=re();//n=2025时输出的是本题的答案
pre();
for(int i=2;i<n;i++)
{
int k1=i-2,k2=n-1-i;
ans+=ksm(2,k1?k1-1:k1)*ksm(2,k2?k2-1:k2)%mod*fac[k1+k2]%mod*inf[k1]%mod*inf[k2]%mod;
ans%=mod;
}
wr(ans);
return 0;
}