NOIP rp++!|| solution - AT_abc433_f
OI 生涯最后一场 abc 了。写篇题解留下个纪念吧。
作为一个非常不会数数题的人,罕见的场切了数数题,保佑我 NOIP 也有这样的运气吧。
首先因为每个情况都可以表示为一段
枚举中间的那个
那么考虑最左边的
第一步是因为
可以参考组合数学常用的基础恒等式。
时间复杂度
代码:
// === / 走吧 就算我们无法让大雨停下 还有我 陪你在雨里放肆奔跑啊 / ===
int n,nxt[N][10],cnt[N][10];
string s;
il void solve(int __Ti)
{
read(s),n=s.size(),s="$"+s+"###";
rep(j,0,9) nxt[n+1][j]=n+1;
rpe(i,n,1) rep(j,0,9) nxt[i][j]=s[i+1]-'0'==j?i+1:nxt[i+1][j],cnt[i][j]=cnt[i+1][j]+(s[i]-'0'==j);
int ans=0,x,y;
rep(i,1,n) if(s[i]<'9')
{
x=cnt[1][s[i]-'0']-cnt[i][s[i]-'0'];
y=cnt[nxt[i][s[i]-'0'+1]][s[i]-'0'+1]-1;
if(y<0) continue;
add(ans,C(x+y+1,x+1));
}
write(ans);
}
华风夏韵,洛水天依!
NOIP rp++!