链接:https://ac.nowcoder.com/acm/contest/51663/B 来源:牛客网 定义一个01串的权值为:任选一个'0'和一个'1',选择不同下标的方案数。例如,"0100"的权值为3:{1,2}、{3,2}和{4,2}共三种方案。 小红想知道,长度为 � n的所有01串的权值之和为多少?答案请对 1 0 9 + 7 10 9 +7取模。
时间: 2023-03-05 16:55:55 浏览: 240
HN_OJ.rar_http://acm.hn_hunan oj_oj_湖南大学oj_湖南大学oj网
5星 · 资源好评率100%
这道题目要求求出所有长度为n的01串的权值之和,其中权值定义为选择一个'0'和一个'1',并且这两个字符的下标不能相同的方案数。
解题思路是,对于每个01串中的每个'0',计算它左边有多少个'1',然后计算它右边有多少个'1',最后将它左边的'1'的个数乘以它右边'1'的个数即为它的贡献值。对于每个01串,将它的贡献值累加起来即可得到所有01串的权值之和。
代码实现时,可以用两个数组分别记录每个'0'左边和右边的'1'的个数,然后遍历所有01串,将每个'0'的贡献值加起来即可。最后记得对答案取模。
下面是一份可能的AC代码:
```python
MOD = 1000000007
n = int(input())
s = input().strip()
# 求每个0左边的1的个数
left_ones = [0] * n
for i in range(1, n):
left_ones[i] = left_ones[i-1]
if s[i-1] == '1':
left_ones[i] += 1
# 求每个0右边的1的个数
right_ones = [0] * n
for i in range(n-2, -1, -1):
right_ones[i] = right_ones[i+1]
if s[i+1] == '1':
right_ones[i] += 1
# 计算所有01串的权值之和
ans = 0
for i in range(n):
if s[i] == '0':
ans += left_ones[i] * right_ones[i]
print(ans % MOD)
```
注意,题目要求对 $10^9+7$ 取模,因此需要在计算过程中及最终答案上都要取模。
阅读全文