专栏文章

solution - CF1422C

CF1422C题解参与者 2已保存评论 1

文章操作

快速查看文章及其快照的属性,并进行相关操作。

当前评论
1 条
当前快照
1 份
快照标识符
@mipnwc4u
此快照首次捕获于
2025/12/03 15:04
3 个月前
此快照最后确认于
2025/12/03 15:04
3 个月前
查看原文
补背包 4/484/48
但是好像不是背包()也不知道为啥教练把这道题放到背包题单里……

Solution

首先拆贡献,考虑一个数 aia_inn 从大到小弟 ii 位)会产生多少贡献。
那么分两种情况讨论。
  • 若删除的区间在 aia_i 前面:这时候 aia_i 的贡献是不变的,即 ai×10nia_i \times 10^{n-i},于是数一下 aia_i 前面的情况数即可。
  • 若删除的区间在 aia_i 后面:假设删除区间的长度为 dd,那么 aia_i 的贡献就是 ai×10nida_i \times 10^{n-i-d},可以发现 dd 和区间个数之间是有规律的,dd+1+1,区间个数 1-1,于是每个 aia_i 所对应的相同 dd 的区间个数都是相同的,后缀处理即可。
时间复杂度 O(n)O(n)

Code

CPP
int n,a[N],pw10[N];

signed main()
{
	pw10[0]=1; rep(i,1,N-1) pw10[i]=mod_(pw10[i-1]*10);
	
	string s; read(s),n=s.size();
	rep(i,1,n) a[i]=s[i-1]-'0';
	
	int ans=0,tmp=0;
	rep(i,1,n) i && add(tmp,i-1),add(ans,mod_(a[i]*tmp*pw10[n-i]));
	tmp=0;
	rpe(i,n,1) i && add(tmp,mod_((n-i)*pw10[n-i-1])),add(ans,mod_(tmp*a[i]));
	write(ans);
	
	return 0;
}

华风夏韵,洛水天依!

评论

1 条评论,欢迎与作者交流。

正在加载评论...