> 可以分析出第i个'1'可以产生的能量,是i - 1个'1'与前面产生的能量,加上i和i-1的距离乘于前面'1'的个数(因为前面每个'1'与第i个1的距离与第i - 1的距离相比都增加了i和i-1的距离)
#include<bits/stdc++.h>
using namespace std;
long long sum[200000];
long long s;//记录上个节点可以与前面节点形成多少ink能量
int n;
char a[200000];
int ans;//记录离上个"1"的距离。
long long p = -1;
long long SUM;
const long long mood = 1e9 + 7;
int main(){
cin >> n;
cin >> a;
for (int i = 0; i < n; i ++){
ans ++;
if (a[i] == '1'){
p ++;
sum[i] = s + p * ans;//记录当前节点可以与前面节点形成多少ink能量。
s = sum[i];//因为sum[i]最大也小于10^14,所以不用取模。
ans = 0;
}
}
for (int i = 0; i < n; i ++) SUM +=sum[i], SUM %= mood;
cout << SUM;
return 0;
}
京公网安备 11010502036488号