专栏文章
题解:AT_abc433_f [ABC433F] 1122 Subsequence 2
AT_abc433_f题解参与者 6已保存评论 6
文章操作
快速查看文章及其快照的属性,并进行相关操作。
- 当前评论
- 4 条
- 当前快照
- 1 份
- 快照标识符
- @min1majz
- 此快照首次捕获于
- 2025/12/01 19:05 3 个月前
- 此快照最后确认于
- 2025/12/01 19:05 3 个月前
赢麻了,前几天刚好学了范德蒙卷积。
范德蒙恒等式有一个变式是:
利用对称性可以得到最原始的式子,组合意义可以轻松证明,就不说了。
回到原题,考虑枚举每一个串的分界点。
这里我们设 为分界点前面包括分界点的某元素出现次数, 为分界点后面对应元素出现次数。
分界点确定后,方案数就是对于每个 前面这个元素中选择 个与后面对应元素中选择 个的方案数之积的和。
列成式子就是:
这个的推导和上面那个变式差不多,一样利用对称性后就可以得到可以套用最原始式子的形式。
然后 和 可以前缀和求,预处理组合数,于是可以做到线性。
CPPvoid solve(){
string s;
cin>>s;
int n=s.size();
s=" "+s;
for(int i=1;i<=n;i++)
for(int j=0;j<10;j++)
qzh[i][j]=qzh[i-1][j]+(j==s[i]-'0');
for(int i=n;i>=1;i--)
for(int j=0;j<10;j++)
hzh[i][j]=hzh[i+1][j]+(j==s[i]-'0');
int ans=0;
for(int i=1;i<=n;i++){
if(s[i]=='9')continue;
int x=qzh[i][s[i]-'0'];
int y=hzh[i][s[i]-'0'+1];
if(x==0||y==0)continue;
ans+=C(x+y-1,x);
ans%=mod;
}
cout<<ans;
}
// 开战与停战,究竟哪边才正确?哪边才符合正义?
// 能对此感到困惑的人可说还算幸运。大部分的人早就将一切都赌在预定会开始的战争上,所以他们只能相信自己选择的道路才是正义。
相关推荐
评论
共 6 条评论,欢迎与作者交流。
正在加载评论...