解析:本题暴力无解,通过查找规律发现,第i个1产生的link能量就是前i-1个1产生的能量*i-1个1到第i个1的距离,最后把每个1的能量是算出来后相加即可
代码如下:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll mod=1e9+7;
ll n;
char a[100005];
ll dp[100005];//dp[i]的意思是第i个1和前面的1产生的能量总和
ll sum,ans=0;
ll num=0;//统计最近两个1之间的距离
ll p=-1;//统计1的个数
int main()
{
cin>>n;
// for(int i=0;i<n;i++)
// {
cin>>a;
// }
for(int i=0;i<n;i++)
{
num++;
if(a[i]=='1')
{
p++;
ans=(ans+p*num)%mod;
dp[i]=ans;
num=0;
}
}
for(int i=0;i<n;i++)
{
sum=(dp[i]+sum)%mod;
}
cout<<sum;
}
}